我有以下數據模型(簡化的)添加屬性:CoreData取指基於謂詞
WordEntity ListItemEntity ListEntity
---------- -------------- ----------
text name
---------- -------------- ----------
listItems <------>> word
list <<---------------> items
和以下基本查詢:
let fetchRequest = NSFetchRequest(entityName: "WordEntity")
let controller = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
let list = <ListEntity instance>
... do something clever here ...
controller.performFetch(nil)
我需要取出的結果中包含的屬性inList
,如果該WordEntity對象附加到一個ListItemEntity,而該ListItemEntity又附加到list
,則該屬性爲true。類似下面的斷言,除了用來創建一個新的屬性,而不是過濾取指令請求:
NSPredicate(format: "ANY listItems.list == %@", list)
我看着NSExpressions但他們似乎只能用來聚集,不能做謂語。 SUBQUERY可以執行謂詞,但僅用於篩選結果集。並計算瞬態屬性可以做任何查找我想要的,但沒有辦法讓他們在外部值操作...
我希望這是明確的......先謝謝了。
更新:
我能做到這一點使用獲取屬性,pbasdf建議。我有一個牽強財產listItemsInList
上WordEntity
與謂詞:
(word == $FETCH_SOURCE) AND (list == $FETCHED_PROPERTY.userInfo.list)
然後在代碼:
let request = NSFetchRequest()
let entity = NSEntityDescription.entityForName("WordEntity", inManagedObjectContext: context)!
request.entity = entity
for property in entity.properties {
if property.name == "listItemsInList" {
let list = <ListEntity instance>
(property as NSFetchedPropertyDescription).userInfo!["list"] = list
}
}
最後:
if word.listItemsInList.count > 0 {
... this is what I was looking for ...
}
這工作。不幸的是它效率很低。獲取的屬性總是返回獲取對象的數組,而不是計算值。他們總是抓取整個物體。最糟糕的是,它們不能被預取,所以檢查表格單元格中的屬性意味着每行都有一個數據庫命中。所以我仍然希望有一個更聰明的方法來做到這一點。
你看過Fetched Properties嗎? – pbasdf 2014-09-24 10:59:57
謝謝。我不認爲這是可以取得的屬性,但我再次嘗試你的建議,我得到它的工作。我已經用細節更新了這個問題。 – user1498059 2014-09-25 05:05:52
如果你只是想檢查一個給定的單詞是否在給定的列表中,請嘗試'if([word.listItems intersectsSet:list.items]){...}'(對不起,Objective-C)。 – pbasdf 2014-09-25 08:35:38