简单的问题,但对我来说,执行艰难。我只是在使用alpha版本的应用程序,但我的测试人员需要拥有最新的数据库。我有一个Core Data模型,包含两个实体:Clothing和ClothingRecord。
服装是一个“静态”模型,它预装数据(如帽子,衬衫,裤子等),只有在我更新模型时才会更改。
ClothingRecord 是与实体服装有关系的用户填充实体。
我刚刚遇到的是我想要更改服装中的数据。不仅更改服装的属性(比如将名称从“帽子”更改为“帽子”),但我也想添加和删除项目。
我对Core Data相当新,所以我使用了Ray Wenderlich关于如何预加载数据的教程: http://www.raywenderlich.com/980/core-data-tutorial-how-to-preloadimport-existing-data
这是第一次运作良好。我有一个数据库启动并运行。但是,现在我改变了它,我不确定如何正确更新服装实体。我是否遍历所有对象并进行比较?我只是添加新东西吗?由于现有的关系,我不能去删除对象,对吗?
是否有关于如何使用预加载的数据更新Core Data驱动的应用程序的指南或教程?我会想象这种情况一直都会发生,但我找不到任何可靠的资源。
答案 0 :(得分:2)
我是否遍历所有对象并进行比较?我只是添加新东西吗?一世 因为现有的关系,不能去删除对象,对吗?
这取决于。我会尽力给你一些建议。
我是否遍历所有对象并进行比较?
要遍历和比较,首先,我将插入一个用作标识符的属性(例如guid)。拥有标识符可以让您比较使用Core Data检索的对象。例如,如果“Hat”具有1234
的guid且“Cap”具有相同的guid,则可以简单地获取标识符并使用新名称更新该对象。这可以通过设置NSPredicate
(how-to-update-existing-object-in-core-data)来实现。
我只是添加新内容吗?
如果您与第二个实体没有关系,则可以这样做。相反,您需要将新对象与原始关系链接起来。
由于现有关系,我无法删除对象
与以前一样,您需要更新这些关系,然后删除您感兴趣的对象。
如果您刚开始使用CD,我会尝试第一个解决方案。我还建议在之前的SO帖子中写一篇关于核心数据的一般性回答(mapping-business-objects-with-core-data-in-ios)。
希望它有所帮助。
修改强>
关于最后两个选项,您可以执行两步操作。
首先,创建一个允许您抓取预先填充的Clothing
对象的请求。
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Clothing" inManagedObjectContext:moc]];
NSError *error = nil;
NSArray *results = [moc executeFetchRequest:request error:&error];
数组results
包含检索到的对象,现在使用for-loop
创建新对象并设置正确的关系。
for(Clothing* clothing in results) {
Clothing* newClothing = [NSEntityDescription insertNewObjectForEntityForName:@"Clothing" inManagedObjectContext:moc];
newClothing.name = @"Cap";
newClothing.relationshipToWhatYouWant = clothing.relationshipToWhatYouWant;
}
最后,如果需要,请删除旧对象。
P.S。检查代码,因为我是手写的。