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

我已经有了用Core Data插入logging和删除记​​录的基本知识; 不过,我会感谢最常用的function之一 – 插入/更新

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

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

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

有两种方法可以将数据插入到核心数据中 – 无论使用哪种方法都取决于您。 但是,其中之一取决于您是否为Core Data数据库的数据模型生成了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]); } 

这假设你已经设置了pipe理对象的上下文。 如果您创build对象并将其插入到循环中的上下文中,然后在循环结束后保存,则效率会更高。

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

 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才能生效。

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

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

要检查现有的logging,您需要创build一个Fetch Request,然后在您的托pipe对象上下文中执行它。 Fetch Request只需要一个实体(所以它知道要在哪个表上进行search)。 要指定search条件,您将需要创build一个谓词(否则请求将简单地返回表中的所有内容)。 您也可以指定一组sorting描述符,以便对结果进行sorting。

 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]; 

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

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

您也可以使用上述function从这一点删除logging。

有关提取请求的更多信息,请给我们看看。 我也强烈build议阅读关于sorting描述符和谓词,因为它们对于searchCore Data数据库非常重要,并且它们的某些用途比其他用途效率低(特别是在创buildNSPredicates时)。

祝你好运!