我想在后台线程中刷新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对象的安全访问)
答案 0 :(得分:12)
视图控制器依赖于可以从其下面删除的数据模型通常不是一个好的设计模式。通过检查其object.invalidated
属性,可以检查是否已删除Realm对象以避免异常。
在任何情况下,要创建Realm对象的分离副本,您需要做的就是:
RLMObject *copiedObject = [[RLMObject alloc] initWithValue:object];
这将创建对象的副本,但不会将其插入任何Realm实例。请注意,如果对象链接到任何其他Realm对象,则不会复制这些对象;新对象将指向现有副本。
但我仍然觉得我需要提一下,您可能只是让您的Web服务更新Realm的实现更加智能,以避免需要这样做。
如果您的对象实施a primary key,那么当您致电createOrUpdateInRealm
时,现有对象将使用新值进行更新。