Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用核心数据执行插入/更新_Ios_Objective C_Iphone_Core Data - Fatal编程技术网

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

Ios 如何使用核心数据执行插入/更新,ios,objective-c,iphone,core-data,Ios,Objective C,Iphone,Core Data,我已经掌握了使用核心数据插入记录和删除记录的基本知识;不过,我非常感谢您对最常见的功能之一的帮助—插入/更新 基本上,我使用NSMutableArrayarrayWithContentsOfURL获取一个数组,该数组包含mysql表中的行。我现在需要做的是同步我的CoreData存储 换句话说,我需要将数组中的每一行添加到我的CoreData表中,但是如果它已经存在,我需要用最新的值更新记录。此外,如果它存在于核心数据中,而不存在于下载的阵列中,则需要将其删除 我可能可以一起解决这个问题;但是,

我已经掌握了使用核心数据插入记录和删除记录的基本知识;不过,我非常感谢您对最常见的功能之一的帮助—插入/更新

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

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


我可能可以一起解决这个问题;但是,我想看看它是如何在没有内存泄漏的情况下正确、高效地完成的。

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

通常的方法是使用以下各项:

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]);
}
[context deleteObject:object];
这是假设您已经设置了托管对象上下文。 如果在循环中创建对象并将其插入到上下文中,然后在循环结束后保存,则效率会更高

另一种方法没有太大区别,但在类型安全性方面更安全。如果已生成模型类(可以从 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]);
}
要从表中删除,只需从表中检索对象(我假设您在这里使用第二种方法进行插入,因此生成了模型类),并使用以下方法:

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]);
}
[context deleteObject:object];
请注意,您需要调用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];
这段代码创建一个fetch请求,并返回数组中名为“table”的表中的每个对象。 从这里开始,因为所有必需的对象都在数组中,所以您可以检查和编辑记录。如果您做了任何更改,请记住保存上下文! 下面的循环使用与上述示例相同的表记录每个对象中的第一个值

for(TableObject *object in array)
{
    NSLog(@"object value1 = %@", object.value1);
}
您还可以使用上述功能从此点删除记录

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


祝你好运

嗨,安德鲁,谢谢你的回复。正如我在问题中提到的,我已经理解了如何使用NSManagedObject将记录插入核心数据。我正在寻求代码方面的帮助,以检查核心数据中已经存在的记录,然后根据我下载的NSMutableArray中的记录进行更新、删除或插入新的记录。我知道这已经晚了,但如果要从核心数据中删除阵列中不存在的项,你为什么不从核心数据中删除所有项目,然后插入所有新项目呢。插入和更新现有的版本可能要容易得多。@Ben:好建议,但这样做可能会慢得多吗?尤其是在表中有许多条目,只有几个条目需要更改的情况下。在你不需要的时候写那么多可能会很有意义,对吗?@GeneralMike yes如果你有很多行,肯定会更有效率。当时我还没有学会正确的方法:)