我正在学习NSCoreData,在介绍我现有的一些项目之前,我想验证我对核心原理的理解。 根据我的理解,NSCoreData通过从NSManagedObject而不是从NSObject继承我们的Model类,更容易管理对象的本地存储(之后的+检索)。
对吗?
那时我有几个问题。让我们考虑构建一个房地产应用程序作为核心模型对象,类属性可以代表公寓,房屋和所有相关信息。目前,它在我的应用程序中作为NSObject的子类进行管理。 1)我通过搜索查询从服务器检索属性,并编写了initWithJson :
方法来填充每个实例。
现在如果我从NSManagedObject子类化Property,我将使用
+(id)insertNewObjectForEntityForName:(NSString *)entityName
inManagedObjectContext:(NSManagedObjectContext *)context
我仍然可以在课程中添加populateWithJson:
来填写属性。
然后我将在当前的managedObjectContext中创建许多Property实例,如果我进行保存,它们将存储在物理层。
如果我再次调用相同的Web服务,并检索相同的JSON内容,我将重新创建相同的托管对象。
如何避免[managedObjectContext save:&error]
调用的冗余,而不是实际存储一次真实生命属性的表示?
2)让我们说我只想在物理上存储一些属性,例如只有用户想要拥有的属性。
[managedObjectContext save:&error]
会将所有创建/修改/删除的托管对象从上下文保存到物理层,而不仅仅是我想要的那个。
如何实现?
我是否应该声明另一个上下文(managedObjectContext2),移动我想要存储在该上下文中的实例,并在那个中进行保存?
(我的意思是,我将有一个上下文来操作对象,从JSON创建实例并在UI中表示它们......以及第二个实际存储的实例)
或者我应该存储所有对象,并添加一个isFavorite BOOL属性,然后使用该属性上的谓词进行提取?
3)应用程序有一个共同的导航模式:UITableView列出了具有所需最少信息的Properties实例,并且在详细视图上调用webservice以请求有关特定Property实例的更多信息(图像,全文描述)。例如,只有当property.fullDescription为nil时才调用webservice,然后更新对象并在本地存储所有详细信息,下次仅在本地使用谓词获取它时,这是一个好习惯吗? property.id? 在创建服务器端后可能更新的对象怎么办?
感谢你的灯光
答案 0 :(得分:1)
1)将服务器数据检索为临时表单(字典数组?),然后对于数组中的每个可能属性,检查核心数据中是否已有匹配的对象。如果您这样做,请忽略它或更新任何更改的属性;如果没有,请创建一个Property
对象。
2)确定要保留哪些内容以支持您的应用功能。为您不想保存的内容创建托管对象毫无意义。但请注意,如果您同时需要Property
和FavoriteProperty
,Core Data会支持子类。
3)完全符合您的“业务规则”......您多久需要更新一次本地数据?唯一的技术考虑因素可能是不在本地保存大型文件的指南,可以按需重新创建。