Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.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
Iphone 核心数据中的主键行为_Iphone_Objective C_Cocoa_Core Data_Primary Key - Fatal编程技术网

Iphone 核心数据中的主键行为

Iphone 核心数据中的主键行为,iphone,objective-c,cocoa,core-data,primary-key,Iphone,Objective C,Cocoa,Core Data,Primary Key,我正在制作一个从xml解析提要并使用核心数据存储它们的应用程序。 我现在处理的问题是重复条目。我正在解析的每个提要都包含一个唯一的id,这是我在模型中作为int得到的。现在我需要告诉核心数据not,如果已经存在另一个具有相同id的实体,则存储该实体 例如,假设我的模型具有以下属性: Story.id (int) - primary key Story.title (NSString) Story.date (NSDate) 实现这一点的最佳方式是什么 我的方法是保留数据库中所有可用ID的记录(

我正在制作一个从xml解析提要并使用核心数据存储它们的应用程序。 我现在处理的问题是重复条目。我正在解析的每个提要都包含一个唯一的id,这是我在模型中作为int得到的。现在我需要告诉核心数据not,如果已经存在另一个具有相同id的实体,则存储该实体

例如,假设我的模型具有以下属性:

Story.id (int) - primary key
Story.title (NSString)
Story.date (NSDate)
实现这一点的最佳方式是什么


我的方法是保留数据库中所有可用ID的记录(数组),在插入任何ID之前,检查它是否存在。这可能适用于我的应用程序的大小,但我觉得这不是正确的方法。

我认为有两种方法可以做到这一点。在我看来,后者(你提出的方法)是更好的解决办法

我将id改为primaryKey,因为我认为在Object-C中使用id作为变量或方法名不是一个好主意,因为它是一个关键字。我可能会工作,但我从未真正尝试过。我还假设primaryKey是一个NSNumber,因为这是存储在核心数据中的方式

方法一每次都会对上下文执行一个提取请求:

for (id data in someSetOfDataToImport) {
    NSFetchRequest * request = [[NSFetchRequest alloc] init];

    [request setEntity:[NSEntityDescription entityForName:@"Story" inManagedObjectContext:context]];
    [request setPredicate:[NSPredicate predicateWithFormat:@"primaryKey = %d", primaryKey]];
    NSUInteger count = [context countForFetchRequest:request error:nil];
    [request release];

    if (count > 0)
        continue;

    // Insert data in Managed Object Context
}
方法二按照您的建议,将密钥缓存在数组中并进行检查,而不是转到源:

NSFetchRequest * request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Story" inManagedObjectContext:context]];
NSArray * allStories = [context countForFetchRequest:request error:nil];
[request release];

NSMutableArray * allPrimaryKeys = [[allStories valueForKeyPath:@"@distinctUnionOfObjects.primaryKey"] mutableCopy];

for (id data in someSetOfDataToImport) {
    if ([allPrimaryKeys containsObject:data.primaryKey])
        continue;

    [allPrimaryKeys addObject:data.primaryKey];

    // Insert data in Managed Object Context
}

[allPrimaryKeys release];

我要警告您不要过早优化。这是所有编程邪恶和浪费时间的根源

坦白地说,在iPhone上,几乎不可能获得如此巨大的对象图,以至于你开始注意到它会让事情陷入困境。我无法想象你每秒处理数百个独特的xml提要


除非您一次处理数十万个主键,否则谓词方法将占用很少的时间和资源,同时最小化复杂性、维护和编程时间。这是最简单、最快捷的解决方案,因此,只有在以后确定它是一个瓶颈时,才可以使用它开始优化

我有一个应用程序,它使用top-fetch方法来查看项目是否存在。对于我拥有的各种音量,它运行良好,速度非常快。这两种方法都很好,只是您的需求问题。我使用第一种方法模拟SQL替换或更新,如果找不到对象,则创建一个新对象,如果找到对象,则使用它,然后保存。因此,如果是新的,它会插入,如果存在,它会更新。我想这就是我将使用的方法,是的。