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时).
祝好运!