Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何创建只读领域对象?_Android_Realm - Fatal编程技术网

Android 如何创建只读领域对象?

Android 如何创建只读领域对象?,android,realm,Android,Realm,假设我的android应用程序中有两个领域文件,A和B。A是加密的,B不是。我在UI线程上查询一个领域,得到一个领域对象,其中包含一组字符串属性。现在,基于这些属性,我需要使用executeTransaction更新领域B中的对象,以避免在UI线程中进行更新。execute方法为我提供了对领域B实例的引用,但我还需要打开领域a,因为我无法与此线程共享上一个对象。由于领域A是加密的,我认为在事务中打开和关闭它可能有点慢。创建领域对象的只读副本并在事务中使用该副本不是更快吗?应该是这样的: Real

假设我的android应用程序中有两个领域文件,A和B。A是加密的,B不是。我在UI线程上查询一个领域,得到一个领域对象,其中包含一组字符串属性。现在,基于这些属性,我需要使用
executeTransaction
更新领域B中的对象,以避免在UI线程中进行更新。execute方法为我提供了对领域B实例的引用,但我还需要打开领域a,因为我无法与此线程共享上一个对象。由于领域A是加密的,我认为在事务中打开和关闭它可能有点慢。创建领域对象的只读副本并在事务中使用该副本不是更快吗?应该是这样的:

RealmObject var1 = realmA.where(SensibleData.class).findFirst();
final ReadOnlyObject myReadOnlyObject = copyRealmObject(var1);
realmB.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
    //use myReadOnlyObject to decide how to update RealmObjects
    }
});        
这是解决我问题的好办法吗?实现
copyRealmObject
以避免领域内存问题的好方法是什么?更具体地说,复制字符串的最佳方式是什么?也许像

copiedAttribute = new String(realmObject.getSomeStringAttribute());  

首先,您调用的
Realm.executeTransaction(Realm.Transaction)
是一个同步版本。它将在调用方的线程中运行。您需要调用
executeTransaction(Realm.Transaction,Realm.Transaction.Callback Callback)
来调用异步调用。看

对于您的情况,您可以:

  • 只需在事务中打开加密域,我不认为它会很慢:),但它会添加几行代码来打开/关闭/查询对象

  • 使用
    Realm.copyFromRealm
    。它将从RealmObject中删除RealmObject,使其独立,并可以通过线程进行传递。虽然它不是只读的,但它对于您的用户案例来说非常方便。看

  • ----对于复制
    字符串
    问题


    我认为您永远不需要复制
    字符串,因为字符串是不可变的。您应该只使用getter返回的字符串。

    首先,您调用的
    Realm.executeTransaction(Realm.Transaction)
    是一个同步版本。它将在调用方的线程中运行。您需要调用
    executeTransaction(Realm.Transaction,Realm.Transaction.Callback Callback)
    来调用异步调用。看

    对于您的情况,您可以:

  • 只需在事务中打开加密域,我不认为它会很慢:),但它会添加几行代码来打开/关闭/查询对象

  • 使用
    Realm.copyFromRealm
    。它将从RealmObject中删除RealmObject,使其独立,并可以通过线程进行传递。虽然它不是只读的,但它对于您的用户案例来说非常方便。看

  • ----对于复制
    字符串
    问题

    我认为您永远不需要复制
    字符串,因为字符串是不可变的。您应该只使用getter返回的字符串