我处在一个非常普遍的情况下,主要是由于缺乏经验......
我的应用程序在第一次启动时在数据库中插入预建数据。 我只是检查设备中是否存在数据库...如果它不存在,这是第一次启动,所以我在创建数据库后添加我的预构建数据。
在开发结束时我决定激活 iCloud,哇!只需一行代码即可使其工作......我在不同的设备上尝试过,我的预建数据显然是重复的:(
我了解到管理预建数据的更好方法是使用多个持久存储,为预建数据创建只读存储(我的预建数据不需要由用户,所以只读解决方案就可以了)。
问题是我在用户插入的数据之间存在关系,因此我无法处理多个持久存储(核心数据不支持不同存储之间的关系)。
我查看了 Fetched Properties,但它似乎需要对我的代码进行 super 大刀阔斧的修改。
我想去重复数据......所以只删除数据库中已经存在的数据,我怀疑这个过程对关系来说真的很危险,我怎么能删除只是重复的对象第一次发布时创建的“原始”?=
鉴于用户无法修改或删除我的预构建数据,您认为这是解决此问题的最佳方法?
//编辑:关于模型的一些信息:
用户正在处理的实体(添加/编辑/修改)代表一个任务。 该实体有一个名称和一个类别。
CATEGORY 是我预先构建的实体。
所以用户为任务添加一个名称并从预建数据中选择一个类别。
最佳答案
在您的 Category 实体中,在 PrebuiltData 模型中,创建一个“id”属性(并确保它在各个版本之间保持一致)此模型不应由 iCloud 管理。
在您的 Task 实体中,在 UserData 模型中,创建一个“categoryId”属性。这种模式应该由iCloud来管理(否则讨论毫无意义)
现在您可以在类别实体上创建一个方法来获取类别中的所有任务,使用:
-(NSArray*)tasks
{
NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"Task"];
request.predicate = [NSPredicate predicateWithFormat:@"id = %@", self.id];
return [gTaskManagedObjectContext executeFetchRequest:request error:NULL];
}
同样,您可以在任务实体上创建一个方法来获取类别:
-(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;
}
关于ios - iOS 7 的核心数据、iCloud 和预构建数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22488789/