iphone - Core Data iPhone 中的主键行为

标签 iphone objective-c cocoa core-data primary-key

我正在制作一个应用程序,它从 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/

相关文章:

objective-c - NSTableView 不显示 NSMutableArray 的内容

macos - VS Cocoa - 尝试打开 Main.Storyboard 时出错 : "id cannot be empty"

iphone - iphone 的 mac 地址是静态的吗?寻找一种方法来识别哪个用户在线

iphone - 如何使用动画隐藏工具栏

ios - UIAlertView clickedButtonAtIndex 方法未被调用

ios - 如何使用 nib 文件为 TableView 创建动态单元格

iphone - 将许多 subview 添加到 View Controller 默认 View 是否会使我的应用程序变慢?

ios - 在 UITableview 中添加 UITextField

ios - 警告 : Attempt to present <MyViewController: 0x10c5771a0> on <UINavigationController: 0x10c533da0> whose view is not in the window hierarchy

objective-c - 如何获得 NSViews 和 NSControls 的默认插入?