【问题标题】:Delete the model from the Realm but keep the object alive从领域中删除模型但保持对象活着
【发布时间】:2015-04-02 23:59:53
【问题描述】:

让我们举个例子:

我们与一组动物一起工作。假设我们不需要所有动物都保存在数据库中,并且有一个控制从数据库中添加和删除动物的逻辑。

例如,我有一个对象,一匹马,其字符串属性为 name,带有“Suey”,我将她添加到 Realm,带有 addObject:。 所以现在我们将这个对象保存到了 Realm 中。这个对象是有效的,我们可以做horse.name,它会返回“Suey”。

接下来发生的事情是我需要从 DB 中删除 Suey。我做deleteObject:。但可悲的是,它不仅删除了有关马的持久信息,而且还使我的对象无效。苏伊基本上已经死了,所以如果我想让她回到数据库中,我需要从头开始创造另一匹马,只有在那之后我才能在数据库中拥有另一匹苏伊。

还有其他方法可以让 Suey 活着,这样我可以更灵活地管理她的状态吗?

我希望我说清楚了,如果您有任何问题,请告诉我。

提前致谢!

更新

马是一对多的关系,所以它的寿命也会影响相关模型的属性。

【问题讨论】:

  • 有没有一对多的关系?有没有可能你会添加多个小时,比如 'Suey' 然后 'Duey' ?如果不是,那么您可以将 name 的值设置为 nil,而不是删除该对象。在添加对象是否存在时,您可以设置 name 属性而不是 addObject。
  • 是的,存在一对多的关系。我会更新问题,谢谢。

标签: ios realm


【解决方案1】:

领域中的对象是数据库中等效对象的访问器。如果出于某种原因,您需要将对象变量与其在磁盘上的表示“分离”,您可以将其复制到内存中。一种简单的方法是使用持久对象的内容创建一个新的非持久对象:

// Assuming `Horse` inherits from `RLMObject` and `persistedHorse` is attached to an `RLMRealm`.
Horse *persistedHorse = ...;
Horse *inMemoryHorseCopy = [[Horse alloc] initWithObject:persistedHorse];
// This will create a new `Horse` object, not tied to an RLMRealm,
// by copying the contents of `persistedHorse`.

当您需要将现有 RLMObject 复制到独立对象(如上)或另一个领域时,您可以使用相同的方法。

【讨论】:

  • 我注意到 Realm 对象没有实现NSCoding 协议,所以基本上这个想法是实现类似-copy 的方法。好的,感谢您分享这个想法,我会记住这是“分离”的方式。谢谢!
【解决方案2】:

根据documentation,每次修改查询结果对象(在您的情况下为名称为 Suey 的 Object Horse)都会直接修改磁盘上的数据,因为结果是实际数据而不是它的副本。因此,如果您移除这匹马,您必须创建一匹新马。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    相关资源
    最近更新 更多