我正在制作一个应用程序,它从 xml 解析提要并使用核心数据存储它们。 我目前正在处理的问题是重复条目。我正在解析的每个提要都包含一个唯一的 id,这是我在模型中作为 int 获得的东西。现在我需要的是告诉 Core Data 不要存储该实体,如果另一个具有相同 ID 的实体已经存在的话。
例如,假设我的模型具有以下属性:
Story.id (int) - primary key
Story.title (NSString)
Story.date (NSDate)
实现它的最佳方法是什么?
我的方法是保留数据库中所有可用 ID 的记录(数组),并在插入任何内容之前检查它是否存在。这可能适用于我的应用程序的大小,但我觉得这不是正确的方法。
最佳答案
我看到有两种方法可以做到这一点。在我看来,后者(您提出的方法)是更好的解决方案。
我将 id 更改为 primaryKey,因为我认为将 id 用作 Object-C 中的变量或方法名称不是一个好主意,因为它是一个关键字。我可能会工作,我从来没有真正尝试过。我还假设 primaryKey 是一个 NSNumber,因为这是存储在 Core Data 中的方式。
方法一每次都会在上下文中执行一个获取请求:
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 - Core Data iPhone 中的主键行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1710526/