2011-09-02 26 views
2

我對iOS/Cocoa相當陌生,我對核心數據有一個非常基本的問題。我正在通過互聯網尋找合適的答案/解決方案,但我無法做到。iOS核心數據唯一對象獲取

所以問題是你如何處理核心數據的唯一性?我知道核心數據不是數據庫,它就像一個對象圖。讓我們假設我們有一個名爲'User'的實體,它具有屬性'id'和'name'以及與其他實體的幾個關係。現在我們要更新特定用戶的名稱(例如,Web服務爲我們提供了id和新名稱)。

這是我已經做到了以前的樣子:我聽說

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:[NSEntityDescription entityForName:@"User" inManagedObjectContext:context]]; 
[request setPredicate:[NSPredicate predicateWithFormat:@"id == %@", anId]]; 

NSError *error = nil; 
NSArray *results = [context executeFetchRequest:request error:&error]; 
User *user = [results lastObject]; 

但比這是不好的做法。是否因爲使用謂詞獲取請求非常慢?我無法想象這是如此重要。據我所知,沒有其他方法來獲得一個獨特的對象,而不是檢查每個對象,並檢查相等性。

如果要獲取實體的所有對象,將它們放入數組並將它們放入數組中手動循環(而不是獲取請求)?

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:[NSEntityDescription entityForName:@"User" inManagedObjectContext:context]]; 

NSError *error = nil; 
NSArray *results = [context executeFetchRequest:request error:&error]; 

User *resultUser; 

for(User *user in results){ 
    if([user.id isEqual:anId]) resultUser = user; 
} 

請幫我找到正確的道路和感謝。

回答

4

如果您有一個您正在提取的屬性的索引(模型編輯器中有一個複選框),使用相等謂詞進行提取肯定更有效率。實際上,獲取所有對象並在內存中迭代它們的效率永遠不會更高,但索引使差異更加顯着。

1

您不是獲取唯一對象,而是包含概念上獨特的atrribute值的對象。

所有託管對象都是唯一實例,但核心數據中沒有任何內容強制屬性值是唯一的。原則上可以有任意數量的唯一受管對象,它們具有相同的屬性值。只有關係強化對象圖中的獨特位置。

如果這是您的應用程序需要的,沒有特殊原因不要獲取包含特定值的特定對象。

我想你讀的是不要試圖補習班類似SQL的鍵值爲實體,然後嘗試連接使用謂詞這些密鑰管理的對象在一起,例如做類似的警告:

EntityOne{ 
    sqlKey:string 
} 

EntityTwo{ 
    sqlKey:string 
} 

...然後嘗試將兩個實體的對象與謂詞關聯起來。

(anEntityOneObject.)sqlKey == anEntityTwoObject.sqlKey 

...而不僅僅是在數據模型中設置關係。

EntityOne{ 
    two<-->EntityTwo.entityOne 
} 

EntityTwo{ 
    one<-->EntityOne.two 
} 

...只是找到與AnEntityOneObj.two有關的對象。