【问题标题】:How to Perform a Insert/Update With Core Data如何使用核心数据执行插入/更新
【发布时间】:2011-05-05 09:15:54
【问题描述】:

我已经掌握了使用 Core Data 插入记录和删除记​​录的基础知识;但是,我会感谢您对最常见的功能之一 - 插入/更新的帮助。

基本上,我使用NSMutableArray arrayWithContentsOfURL 来获取包含mysql 表中的行的数组。我现在需要做的是同步我的CoreData 商店。

换句话说,我需要将数组中的每一行添加到我的CoreData 表中,但如果它已经存在,我需要使用最新值更新记录。此外,如果它存在于 Core Data 中而不是下载的数组中,我需要将其删除。

我可能可以一起破解它;但是,我想看看它是如何正确有效地完成而没有内存泄漏的。

【问题讨论】:

  • 我知道这已经很晚了,但是如果您要从核心数据中删除数组中不存在的项目,为什么不直接从核心数据中删除所有项目并插入所有新的。插入与更新现有的可能要容易得多。
  • @Ben:很好的建议,但这不会慢很多吗?特别是在一个表有很多条目并且只有几个需要更改的情况下。在你不需要的时候写那么多东西可能很重要,对吧?
  • @GeneralMike 是的,如果您有很多行,效率肯定会更高。当时我还没有学会正确的方法:)

标签: ios objective-c iphone core-data


【解决方案1】:

有两种方法可以将数据插入到 Core Data 中 - 使用哪种方法取决于您。但是,其中之一取决于您是否为 Core Data db 的数据模型生成了模型类。

常规方法是使用以下方法:

NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:@"table" 
inManagedObjectContext:context];
[object setValue:@"value1" forKey:@"stringColumn"];
[object setValue:12 forKey:@"numberValue"];
NSError *error;
if (![context save:&error]) {
    NSLog(@"Failed to save - error: %@", [error localizedDescription]);
}

这是假设您已经设置了托管对象上下文。 如果您在循环中创建对象并将其插入上下文中,然后在循环结束后保存,效率会更高。

另一种方法没有太大不同,但在类型安全方面更安全。如果您已生成模型类(您可以从 xcdatamodels) 然后您可以简单地创建该类的对象并设置其属性。

TableObject *object = [NSEntityDescription insertNewObjectForEntityForName:@"table" 
inManagedObjectContext:context];
[object setStringColumn:@"value1"];
[object setNumberValue:12];
NSError *error;
if (![context save:&error]) {
    NSLog(@"Failed to save - error: %@", [error localizedDescription]);
}

要从表中删除,只需从表中检索对象(我假设您在这里使用第二种方法进行插入,因此生成了模型类)并使用以下内容:

[context deleteObject:object];

请注意,您还需要调用 save 才能使其生效。

希望这会有所帮助!祝你好运!

编辑: 抱歉,我一定是看错了问题!

要检查现有记录,您需要创建一个获取请求,然后在您的托管对象上下文中执行它。 Fetch Request 至少需要一个实体(因此它知道要在哪个表上搜索)。 要指定搜索词,您需要创建一个谓词(否则请求将简单地返回表中的所有内容)。您还可以指定一组排序描述符,以便对结果进行排序。

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"table" inManagedObjectContext:context];
[request setEntity:entity];

NSError *errorFetch = nil;
NSArray *array = [context executeFetchRequest:request error:&errorFetch];

此代码创建一个获取请求,并从名为“table”的表中返回数组中的每个对象。 从这里开始,由于所有必需的对象都在数组中,您可以检查和编辑记录。如果您进行任何更改,请记住保存上下文! 以下循环使用与上述示例相同的表记录每个对象中的第一个值。

for(TableObject *object in array)
{
    NSLog(@"object value1 = %@", object.value1);
}

您也可以使用上述功能从此时删除记录。

有关获取请求的更多信息,请查看class reference。我还强烈建议您阅读有关排序描述符和谓词的内容,因为它们对于搜索您的 Core Data 数据库非常重要,并且它们的某些用途比其他用途效率低(特别是在创建 NSPredicates 时)。

祝你好运!

【讨论】:

  • 您好安德鲁,感谢您的回复。正如我在问题中提到的,我已经了解如何使用 NSManagedObject 将记录插入核心数据。我正在寻求代码帮助,以检查 Core Data 中已经存在的记录,然后根据我下载的 NSMutableArray 中的记录更新、删除它们或插入新记录。
猜你喜欢
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
  • 2012-02-02
  • 2010-12-16
  • 1970-01-01
相关资源
最近更新 更多