2009-10-01 15 views
4

我試圖執行一個獲取對與該測試針對存在於一個抽象類的某些子類一的keyPath謂語管理對象的上下文請求。CoreData通過抽象的管理對象獲取請求到具體管理對象

例如這裏是對象模型的一部分

Library::NSManagedObject 
- AllMovies::to-many relationship->Movie 

Movie::NSManagedObject (abstract) 
- type::String 
- name::String 
- mylibrary::to-one relationship->Library 

HorrorMovie::Movie 
- monster::String 
- ghosts::BOOL 

RomanceMovie::Movie 
- percociouskid::String 
- hasferret::BOOL 

如果我設置以下取請求

NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Library" 
                inManagedObjectContext:moc]; 
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
[request setEntity:entityDescription]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat: 
          @"(SUBQUERY(AllMovies, $movies, 
                $movies.type like[c] 'horror' and 
                $movies.moster like[c] 'yeti' 
             )[email protected] != 0)" 
          ] 
[request setPredicate:predicate]; 

NSArray *array = [moc executeFetchRequest:request error:&error]; 

執行讀取請求返回像

keypath $movies.monster not found in entity <NSSQLEntity Movie id=2> 
錯誤

似乎沒有辦法對謂詞進行懶惰評估。我已經嘗試過的其他一些事情是使用CAST關鍵字的ANY謂詞,嘗試用另一個SUBQUERY替換SUBQUERY中的「AllMovies」以返回一組匹配'type'值的對象。

這將有可能做對每個符合條件的類型的多個請求,但畢竟是毛,緩慢和笨拙。

這是在OS X 10.6下的SQL持久性存儲。由於我正在與100萬個「圖書館」合作(該項目與電影沒有任何關係,但我認爲這是一個很好的例子),因此在內存商店中做內存是不可取的。

感謝, 羅布

回答

1

這是行不通的,因爲你的實體模型只是告訴核心數據的AllMovies關係包含Movie對象。因此,Core Data希望能夠僅發送對象能夠理解的那些消息。當它鼓動取,它測試謂詞針對每一單Movie對象(如通過取實體指定。)

然而,無論是Movie實體也不是RomanceMovie實體瞭解monster消息(因爲它們缺乏的屬性。)謂詞測試是無意義的。這就是你得到錯誤的原因。

您需要重新考慮您的設計。使用實體繼承可能不是你想要的方式。

+0

Core Data 2017有什麼好的解決方案? – Goppinath