1

简单的问题,但对我来说,执行起来很艰难。我只在开发一个处于 alpha 阶段的应用程序,但我的测试人员需要拥有最新的数据库。我有一个包含两个实体的核心数据模型:服装和服装记录。

Clothing是一个“静态”模型,它具有预加载的数据(如帽子、衬衫、裤子等),只有在我更新模型时才会更改。

ClothingRecord是用户填充的实体,与实体Clothing有关系。

在此处输入图像描述

我刚刚遇到的是我想更改Clothing中的数据。不仅更改 Clothing 的属性(例如将名称从“Hat”更改为“Cap”),而且我还想添加和删除项目。

我对 Core Data 相当陌生,所以我使用了 Ray Wenderlich 的关于如何预加载数据的教程: http ://www.raywenderlich.com/980/core-data-tutorial-how-to-preloadimport-existing-data

这第一次效果很好。我有一个数据库正在运行。但是,现在我已经更改了它,我不确定如何正确更新Clothing实体。我是否遍历所有对象并进行比较?我只是添加新东西吗?由于现有关系,我不能去删除对象,对吗?

是否有关于如何使用预加载数据更新 Core Data 驱动的应用程序的指南或教程?我想这一直在发生,但我找不到任何可靠的资源。

4

1 回答 1

2

我是否遍历所有对象并进行比较?我只是添加新东西吗?由于现有关系,我不能去删除对象,对吗?

这取决于。我会尽力给你一些建议。

我是否遍历所有对象并进行比较?

为了遍历和比较,首先,我将插入一个用作标识符的属性(例如guid)。拥有标识符可以让您将检索到的对象与 Core Data 进行比较。例如,如果“Hat”有一个 guid,1234而“Cap”有相同的 guid,您可以简单地通过标识符获取并使用新名称更新该对象。这可以通过设置NSPredicatehow-to-update-existing-object-in-core-data)来实现。

我只是添加新东西吗?

如果您与第二个实体没有关系,您可以这样做。相反,您需要将新对象与原始关系链接起来。

由于现有关系,我不能去删除对象

和以前一样,您需要重新创建这些关系,然后删除您感兴趣的对象。

如果您刚开始使用 CD,我将尝试第一个解决方案。我还建议了一个旧答案,这是我在之前关于 Core Data 的 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;
}

最后,如果需要,删除旧对象。

PS检查代码,因为我是手写的。

于 2012-06-02T15:47:01.487 回答