2015-04-02 60 views
5

让我们有这样的例子:删除存储领域的模式,但保留对象活着

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

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

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

有没有另一种让苏伊活着的方法,所以我在管理她的状态方面有更多的灵活性?

我希望我明确了这一点,如果您有任何问题,请让我知道。

在此先感谢!

UPDATE

马是从事一个一对多的关系,所以它的寿命也相关模型影响性能。

+0

有没有一对多的关系? 是否有任何可能性,你会添加多个小时,如“苏伊”,然后“Duey”? 如果不是那么删除对象,您可以将名称的值设置为零。 在添加对象时,您可以设置name属性而不是addObject。 – Samir 2015-04-02 09:35:24

+0

是的,有一对多的关系。我会更新这个问题,谢谢。 – Dumoko 2015-04-02 10:51:18

回答

1

Realm中的对象为访问器为数据库中的等效对象。如果出于任何原因,您需要从磁盘表示中“分离”对象变量,则可以将其复制到内存中。一个简单的方法来做到这一点是建立与坚持一个内容的新的,非持久化的对象:

// 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要么变成一项独立单独的对象(如上)或进入另一个领域。

+0

我注意到Realm对象没有实现'NSCoding'协议,所以基本上这个想法是实现类似'-copy'方法的东西。好的,感谢分享这个想法,我会记住这是“分离”的方式。谢谢! – Dumoko 2015-04-03 07:36:50

1

根据documentation对查询结果对象(在您的案例中名为Suey的Object Horse)的每个修改都会直接修改磁盘上的数据,因为结果是实际数据而不是其副本。所以如果你移除马,你必须创建一个新马。