假设我的Android应用程序中有2个领域文件,A和B.A是加密的,B不是。我在UI线程上查询领域A并获得具有一堆String属性的领域对象。现在基于这些属性,我需要使用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 :(得分:0)
首先,您调用的Realm.executeTransaction(Realm.Transaction transaction)
是同步版本。它将在调用者的线程中运行。您需要为异步调用executeTransaction(Realm.Transaction transaction, Realm.Transaction.Callback callback)
。请参阅doc of Realm.executeTransaction
。
对于您的情况,您可以:
只需在交易中打开加密Realm,我就不要期望它变慢:)但它会添加几行代码来打开/关闭/查询对象。
使用Realm.copyFromRealm
。它将从Realm中取消RealmObject,使其独立并可以通过线程传递。虽然它不是只读的,但对于用户案例来说非常方便。请参阅doc or Realm.copyFromRealm
----复制String
问题
我认为你永远不需要复制String
,因为字符串是不可变的。你应该只使用getters返回的String。