首页 文章

是否可以复制Realm对象?

提问于
浏览
3

我想在后台线程中刷新Realm数据库,如下所示:(因为我从Webservice获得了新数据)

RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
[realm deleteAllObjects]; // !!
[Pubs createOrUpdateInRealm:[RLMRealm defaultRealm] withJSONArray:data];
[realm commitWriteTransaction];

问题是,同时我删除并更新了Realm db中的对象,用户可以打开一些Detail ViewController,指向一些同时被删除的Realm对象(Pubs),以便抛出异常 .

我没有看到任何解决方案,除非总是当我想从Detail控制器或其属性访问Realm对象时,我需要总是这样做:

(这意味着总是获得Realm对象,但这可能也会失败)

pub = [Pubs objectsWhere:[NSString stringWithFormat: @"pubId = %lu", (long)_selectedPubId]].firstObject;

但我没有使用这个解决方案 . 我想最好的是如果我可以在详细信息视图控制器中调用这样的东西:

pub = [Pubs objectsWhere:[NSString stringWithFormat: @"pubId = %lu", (long)_selectedPubId]].firstObject;
pub = [pub safeCopy];

因此可以同时删除PubRealmObject,但pub对象将独立存在于内存中(仅用于访问其数据属性) .

有人试过类似的东西吗?

或者甚至可能使用一些iOS SDK方式like this

我只需要像我说的那样访问数据属性,而不是使用删除等领域对象方法或更新数据库中的对象 .

顺便说一句,我试图在主线程中调用Realm db的更新,但问题是需要5-7秒(只有1000个json对象),所以它滞后于应用程序 . 这就是为什么我认为对象的后台更新和安全复制可能会更好 .

但我认为即使在复制对象时它也会失败,那么解决方案是什么呢? (后台更新与Realm对象的安全访问)

1 回答

  • 12

    它可以通过检查 object.invalidated 属性来检查是否已删除Realm对象以避免异常 .

    无论如何,要创建Realm对象的分离副本,您需要做的就是:

    RLMObject *copiedObject = [[RLMObject alloc] initWithValue:object];
    

    这将创建对象的副本,但不会将其插入任何Realm实例 . 请注意,如果对象链接到任何其他Realm对象,则不会复制这些对象;新对象将指向现有副本 .

    但我仍然觉得我需要提一下,你可能只是让你的Web服务更新Realm的实现更加智能,以避免需要这样做 .

    如果对象实现a primary key,则在调用 createOrUpdateInRealm 时,将使用新值更新现有对象 .

    祝好运!

相关问题