iOS 7 的核心数据、iCloud 和预建数据
Posted
技术标签:
【中文标题】iOS 7 的核心数据、iCloud 和预建数据【英文标题】:Core Data, iCloud and Pre-Built Data with iOS 7 【发布时间】:2014-03-18 19:08:49 【问题描述】:我处于一个非常普遍的情况,主要是由于缺乏经验......
我的应用程序在第一次启动时会在数据库中插入预先构建的数据。 我只是检查设备中是否存在数据库...如果它不存在,这是第一次启动,所以我在创建数据库后添加我的预构建数据。
在开发结束时,我决定激活 iCloud,哇!只需一行代码就可以让它工作......我在不同的设备上尝试过,我的预建数据显然是重复的:(
我知道管理预建数据的更好方法是使用多个持久存储,为预建数据创建只读存储(我的预建数据不需要由用户,所以只读解决方案就可以了)。
问题是我在用户插入的数据之间存在关系,因此我无法处理多个持久存储(核心数据不支持不同存储之间的关系)。
我查看了 Fetched Properties,但它似乎需要对我的代码进行超级彻底的编辑。
我想去重复数据删除......所以只是删除已经在数据库中的数据,我怀疑这个过程对关系真的很危险,我怎样才能删除只是重复的对象首次发布时创建的“原始”?=
鉴于用户无法修改或删除我的预构建数据,您认为这是解决此问题的最佳方法吗?
// 编辑:关于模型的一些信息:
用户正在处理(添加/编辑/修改)的实体代表一个任务。 这个实体有一个名字和一个类别。
CATEGORY 是我预先构建的实体。
因此,用户为任务添加名称并从预构建的数据中选择一个类别。
【问题讨论】:
不是检查数据库是否存在,而是检查预建数据是否存在? @David 问题是 iCloud 将来会插入数据。我错了吗? ...我无法验证 iCloud 添加了哪些数据。 另一种选择是将模型拆分为一个模型中的私有预构建数据和另一个模型中的云可变数据。使用某种持久密钥和一些包装来链接两者。如果关系都是从用户数据到预建数据而不是其他方式,这应该是非常简单的。 @RoboticCat 我不认为这是重复的,尽管显然相关。在链接的响应中,问题是处理 iCloud 同步的可变数据。在这种情况下,数据库的一部分本质上是不可变的,并且根本不需要同步,因为它是全局共享的。无论如何,仔细阅读链接的答案是值得的。 【参考方案1】:在您的 Category 实体中,在 PrebuiltData 模型中,创建一个“id”属性(并确保这在各个版本之间保持一致)此模型不应由 iCloud 管理。
在您的 Task 实体中,在 UserData 模型中,创建一个“categoryId”属性。这个模型应该由 iCloud 管理(否则这个讨论毫无意义)
现在您可以在 Category 实体上创建一个方法来获取该类别中的所有任务:
-(NSArray*)tasks
NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"Task"];
request.predicate = [NSPredicate predicateWithFormat:@"id = %@", self.id];
return [gTaskManagedObjectContext executeFetchRequest:request error:NULL];
同样,您可以在 Task 实体上创建一个方法来获取类别:
-(Category*)category
NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"Category"];
request.predicate = [NSPredicate predicateWithFormat:@"id = %@", self.categoryId];
NSArray* results = [gTaskManagedObjectContext executeFetchRequest:request error:NULL];
return results.count > 0 ? results[0] : nil;
【讨论】:
要使 CATEGORY 模型不受 iCloud 管理,您的意思是将其添加到不同的持久存储?我怎样才能决定它应该由 iCloud 管理? 是的,您将有两个模型、两个持久存储等。 这似乎是唯一的办法!以上是关于iOS 7 的核心数据、iCloud 和预建数据的主要内容,如果未能解决你的问题,请参考以下文章