2010-05-13 130 views
1

我有一個對象NetworkMember沒有屬性,但由它的關係Person,Network,Level和Role定義。在我的應用程序中,我發現了所有四種關係,但是我想確保不要對NetworkMember進行雙重註冊,因此我想在實例化之前搜索此NSManagedObject。核心數據:通過其屬性獲取NSManagedObject

我應該如何編寫一個查詢來查詢只包含關係的NSManagedObject?

乾杯

回答

4

您可以像針對屬性一樣針對關係編寫NSPredicate。

例如:

- (BOOL)isPerson:(Person *)person memberOfNetwork:(Network *)network { 
    // assume NetworkMember entity is ivar networkMemberEntity_ 
    // assume NSManagedObjectContext is ivar context_ 

    NSFetchRequest *fetch = [[NSFetchRequest alloc] init]; 
    [fetch setEntity:networkMemberEntity_]; 
    [fetch setPredicate:[NSPredicate predicateWithFormat: 
     @"(person == %@) AND (networks CONTAINS %@)", person, network]]; 
    [fetch setFetchLimit:1]; 

    NSError *error = nil; 
    NSInteger count = [context_ countForFetchRequest:fetch error:&error]; 
    if (count < 0) { 
     // always handle errors in real code 
     // and never check for errors using "error == nil" 
    } 

    return count > 0; 
} 

在你目前的情況,但是,你應該認真考慮是否真的需要做到這一點。這聽起來像是你試圖模擬Person和Network之間的多對多關係。如果你來自數據庫背景,你可能會認爲你需要一個連接表來完成這個工作,並創建一箇中間實體。

但是,核心數據可以爲您管理所有這些;您可以在Person和Network之間直接創建多對多關係,而無需自行維護任何中間實體或表。就像你在處理核心數據中的關係時不必擔心主鍵和外鍵一樣,該框架爲你處理這種事情,讓你在對象級別工作。

+0

非常感謝你,這是我希望的方式,它可以這樣做。 :-) – niklassaers 2010-05-24 08:32:22

+0

只是一個很小的修正:取應該在某些時候,無論是在返回之前初始化或發送釋放後調用自動釋放被釋放。順便說一句,克里斯,你的博客文章已與其他核心數據問題,所以謝謝你一個巨大的幫助! – 2012-01-10 21:38:01

1

您可以使用NSPredicate與鍵值路徑來指代關係作謂語,到NSFetchRequest。例如:

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:[NSEntity entityForName:@"NetworkMember" inManagedObjectContext:managedObjectContext]; 
[request setPredicate:[NSPredicate predicateWithFormat:@"person.name == %@ AND ANY (roles.name == \"Manager\")", name]]; 
NSInteger count = [managedObjectContext countForFetchRequest:request error:&error]; 
[request release]; 
if (error) { /* handle the error */ } 
if (count != 0) { /* do something if the member already exists */ } 

如果你需要的是確認特定對象的存在,你可以使用的方法countForRetchRequest:error:,看看有多少對象將被退回,如果你執行讀取請求。如果你正在做這個測試很多,這可以更有效率。

+0

所以它不可能通過核心數據,否則將使用在sqlite3的分貝幕後的ID查詢? – niklassaers 2010-05-13 18:49:18

+0

您的數據不一定存儲在sqlite數據庫中。核心數據還支持XML和二進制格式,因此將核心數據視爲數據庫並不準確。核心數據確實有'NSManagedObjectID'類唯一標識每個對象,並有你可以用它來獲取基於這些ID對象的方法。 – Alex 2010-05-13 20:44:20

+1

您不應該依賴'-objectID'屬性,因爲它可以並且確實會更改。你唯一應該使用它的時候是在線程之間傳遞引用。除此之外不要依賴它。如果你需要一個獨特的創建你自己的。 – 2010-05-15 16:08:29