如何使用核心数据执行插入/更新

sle*_*tam 26 iphone core-data objective-c ios

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

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

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

我可能会一起破解这个; 但是,我想看看它是如何在没有内存泄漏的情况下正确有效地完成的.

And*_*oli 37

有两种方法可以将数据插入到核心数据中 - 无论您使用哪种方式都取决于您.但是,其中一个取决于您是否为Core Data db的数据模型生成了Model类.

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

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]);
}
Run Code Online (Sandbox Code Playgroud)

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

另一种方法没有太大区别,但在类型安全方面更安全.如果您已经生成了模型类(可以从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]);
}
Run Code Online (Sandbox Code Playgroud)

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

[context deleteObject:object];
Run Code Online (Sandbox Code Playgroud)

请注意,您需要调用save才能生效.

希望这可以帮助!祝好运!

编辑:对不起,我一定误读了这个问题!

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

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];
Run Code Online (Sandbox Code Playgroud)

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

for(TableObject *object in array)
{
    NSLog(@"object value1 = %@", object.value1);
}
Run Code Online (Sandbox Code Playgroud)

您也可以使用上述功能从这一点删除记录.

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

祝好运!