Iphone 核心数据中的主键行为
我正在制作一个从xml解析提要并使用核心数据存储它们的应用程序。 我现在处理的问题是重复条目。我正在解析的每个提要都包含一个唯一的id,这是我在模型中作为int得到的。现在我需要告诉核心数据not,如果已经存在另一个具有相同id的实体,则存储该实体 例如,假设我的模型具有以下属性: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的记录(
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替换或更新,如果找不到对象,则创建一个新对象,如果找到对象,则使用它,然后保存。因此,如果是新的,它会插入,如果存在,它会更新。我想这就是我将使用的方法,是的。