2009-11-10 30 views
3

我正在製作一個應用程序,用於解析xml提要並使用核心數據存儲它們。 我目前正在處理的問題是重複條目。我解析的每個提要都包含一個唯一的ID,這是我在模型中以int形式獲得的。現在我需要告訴核心數據而不是存儲該實體,如果另一個具有相同的ID已經存在。核心數據中的主鍵行爲iPhone

舉個例子,假設我的模型具有以下屬性:

Story.id (int) - primary key 
Story.title (NSString) 
Story.date (NSDate) 

什麼是實現最好的方法是什麼?

我的方法是保留數據庫中所有可用ID的記錄(數組),並在插入任何內容之前檢查它是否存在。這可能適用於我的應用程序的大小,但我覺得這不是正確的方法。

回答

8

我看到了這樣做的兩種方法。在我看來,後者(你提出的方法)是更好的解決方案。

我將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]; 
+0

我有一個使用頂級方法的應用程序 - 獲取以查看該項是否存在。對於我有的音量,它工作正常,速度非常快。這兩種方法都可以正常工作,只是您的需求問題。 – Hunter

+0

科裏感謝上面的代碼。它幫助了很多。 – Dimitris

+1

我使用第一種方法模擬SQL替換或更新,如果我找不到對象,我創建一個新的,如果我找到一個對象,我使用它,然後保存。所以它插入如果它是新的和更新(如果存在)。 –

3

我會提醒你不要過早優化。這是所有編程邪惡的根源,也是浪費時間。

坦率地說,在iPhone上,幾乎不可能獲得如此巨大的對象圖,以至於您開始注意到讓事情陷入困境。我無法想象你每秒處理數百個獨特的XML feed。

除非您同時處理數十萬個主鍵,否則謂詞方法將花費微不足道的時間和資源,同時最大限度地減少複雜性,維護和編程時間。這是最簡單和最快速的解決方案,因此只有在您稍後確定其瓶頸時才使用它來啓動並優化。

+0

我認爲這是我會使用的方法,是的。 – Dimitris