我看到了這樣做的兩種方法。在我看來,後者(你提出的方法)是更好的解決方案。
我將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];
我有一個使用頂級方法的應用程序 - 獲取以查看該項是否存在。對於我有的音量,它工作正常,速度非常快。這兩種方法都可以正常工作,只是您的需求問題。 – Hunter
科裏感謝上面的代碼。它幫助了很多。 – Dimitris
我使用第一種方法模擬SQL替換或更新,如果我找不到對象,我創建一個新的,如果我找到一個對象,我使用它,然後保存。所以它插入如果它是新的和更新(如果存在)。 –