2016-01-13 94 views
1

假设我在我的android应用程序A和B中有2个领域文件.A是加密的,B不是。我在UI线程上查询领域A,并用一堆字符串属性获取领域对象。现在基于这些属性,我需要使用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()); 

回答

0

首先,在Realm.executeTransaction(Realm.Transaction transaction)你称为是同步的版本。它将运行在调用者的线程中。您需要拨打executeTransaction(Realm.Transaction transaction, Realm.Transaction.Callback callback)作为异步版本。见doc of Realm.executeTransaction

对于你的情况,你可以:

  1. 只要打开事务中的加密领域,我不希望它是缓慢的:)但它会添加几行代码用于打开/关闭/查询对象。使用Realm.copyFromRealm。它会将RealmObject从Realm中分离出来,使其可以独立运行,并且可以通过线程传递。尽管它不是只读的,但对于您的用户案例来说,这将非常方便。见doc or Realm.copyFromRealm

----对于复制String问题

我想你永远不需要复制String,因为字符串是不可改变的。你应该只使用getters返回的字符串。

相关问题