我有以下数据模型(简化的)添加属性: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