如何创建只读领域对象?

时间:2016-01-13 14:54:40

标签: android realm

假设我的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());  

1 个答案:

答案 0 :(得分:0)

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

对于您的情况,您可以:

  1. 只需在交易中打开加密Realm,我就不要期望它变慢:)但它会添加几行代码来打开/关闭/查询对象。

  2. 使用Realm.copyFromRealm。它将从Realm中取消RealmObject,使其独立并可以通过线程传递。虽然它不是只读的,但对于用户案例来说非常方便。请参阅doc or Realm.copyFromRealm

  3. ----复制String问题

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