我有一個對象NetworkMember沒有屬性,但由它的關係Person,Network,Level和Role定義。在我的應用程序中,我發現了所有四種關係,但是我想確保不要對NetworkMember進行雙重註冊,因此我想在實例化之前搜索此NSManagedObject。核心數據:通過其屬性獲取NSManagedObject
我應該如何編寫一個查詢來查詢只包含關係的NSManagedObject?
乾杯
聶
我有一個對象NetworkMember沒有屬性,但由它的關係Person,Network,Level和Role定義。在我的應用程序中,我發現了所有四種關係,但是我想確保不要對NetworkMember進行雙重註冊,因此我想在實例化之前搜索此NSManagedObject。核心數據:通過其屬性獲取NSManagedObject
我應該如何編寫一個查詢來查詢只包含關係的NSManagedObject?
乾杯
聶
您可以像針對屬性一樣針對關係編寫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之間直接創建多對多關係,而無需自行維護任何中間實體或表。就像你在處理核心數據中的關係時不必擔心主鍵和外鍵一樣,該框架爲你處理這種事情,讓你在對象級別工作。
您可以使用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:
,看看有多少對象將被退回,如果你執行讀取請求。如果你正在做這個測試很多,這可以更有效率。
所以它不可能通過核心數據,否則將使用在sqlite3的分貝幕後的ID查詢? – niklassaers 2010-05-13 18:49:18
您的數據不一定存儲在sqlite數據庫中。核心數據還支持XML和二進制格式,因此將核心數據視爲數據庫並不準確。核心數據確實有'NSManagedObjectID'類唯一標識每個對象,並有你可以用它來獲取基於這些ID對象的方法。 – Alex 2010-05-13 20:44:20
您不應該依賴'-objectID'屬性,因爲它可以並且確實會更改。你唯一應該使用它的時候是在線程之間傳遞引用。除此之外不要依賴它。如果你需要一個獨特的創建你自己的。 – 2010-05-15 16:08:29
非常感謝你,這是我希望的方式,它可以這樣做。 :-) – niklassaers 2010-05-24 08:32:22
只是一個很小的修正:取應該在某些時候,無論是在返回之前初始化或發送釋放後調用自動釋放被釋放。順便說一句,克里斯,你的博客文章已與其他核心數據問題,所以謝謝你一個巨大的幫助! – 2012-01-10 21:38:01