2013-04-11 109 views
6

我对如何使用一些核心数据的NSManagedObject子类来处理持久性数据和非持久性数据有一些想法。使用NSManagedObject子类传输持久性和非持久性数据

比方说,你有一个食谱应用程序显示你自己的CoreData食谱列表,在这个相同的应用程序,你也可以搜索其他用户食谱。 这些其他用户配方当然是来自API,我们不希望将它们保存到核心数据中。 但是我们想要的是我们的配方详细信息视图控制器行事相同,要么给它一个持久性配方或非持久性配方。 我自然认为我们应该在数据的周围使用相同的对象包装,并让我们的视图控制器在数据的来源上失明。

问题是,NSManagedObject的子类不能手动初始化,必须插入到上下文中。这对我们的其他用户食谱并不好。另一方面,对于我们自己的食谱,我们需要将这些对象插入到上下文中。

我有几个解决方案,但我真的很想看看你们对这个问题的看法。

你会说这是一些实现问题,应该通过将两个数据对象包装到一个对象中来解决?例如,通过覆盖所有getter和setter来处理coredata对象和NSDictionary对象?

或者它是一个体系结构问题,你可以通过嵌套NSManagedContext或使用多个持久性存储(一个在内存中,另一个是Sqlite)来解决它?

回答

7

实际上,您可以创建NSManagedObject实例,而无需将其插入到上下文中。只需通过nil作为托管对象上下文参数。做类似:

NSEntityDescription *myRecipeEntity = [NSEntityDescription entityForName:@"MyRecipeEntity" inManagedObjectContext:[self managedObjectContext]]; 
MyRecipeClass *recipe = [[MyRecipeClass alloc] initWithEntity:myRecipeEntity insertIntoManagedObjectContext:nil]]; 

现在你有一个配方实例,不在任何上下文中。

如果以后想将它添加到上下文:

[[self managedObjectContext] insertObject:recipe]; 

如果你不想插入它,只是把它扔掉。

+0

这很有趣!感谢您指出了这一点。 – 2013-04-11 17:55:07

+0

据我所知,您不能在未插入上下文的对象之间建立关系。 – svena 2013-04-11 19:54:12

+0

当然。但这并不总是很重要。 – 2013-04-11 20:44:13

1

我可能只是使用一个单独的环境,你永远不会保存,这似乎是最简单的路线。

0

模型配置 - 内存中存储和sqlite支持的存储。

我会认真考虑使用模型配置和两个持久存储类型: 内存中和sqlite支持。

但这也意味着你将不得不为可下载的数据创建单独的实体,这种做法可能会导致某些配方持续存在,并且在临时配方时暂时存在某些配方。而且,您不能在不同的持久存储中的实体之间建立关系。你会放弃逆向关系的好处,并且必须用例如提取的属性来模仿它。

总而言之,这是一个可行的选择,有一些缺点。

隔离管理对象上下文

使用单独的管理对象上下文的最大的好处是,你可以使用相同的配方实体永久和临时数据。您必须避免保存临时上下文,并且必须从持久性存储中引入所有更改,或者从包含您保存的数据的其他上下文合并。

这种替代方案的挑战在于,您必须在这个独立的上下文的基础上构建大部分用户界面,但您所做的所有永久性更改都需要保存到主要上下文中,并通过合并到独立上下文。这可能会引入一些棘手的情况,但我认为这是可行的。