gpt4 book ai didi

iphone - Core Data iPhone 中的主键行为

转载 作者:搜寻专家 更新时间:2023-10-30 19:53:50 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com