我有一个使用CoreData的应用程序,我正在尝试找出通过标记实现标记和过滤的最佳方法。出于我的目的,如果我在原始SQLite中执行此操作,我只需要三个表,tags
,item_tags
,当然还有我的items
表。然后过滤就像在三个表之间连接一样简单,其中只有items
与给定标签相关。相当简单。
但是,有没有办法在CoreData中使用NSFetchedResultsController
? NSPredicate
似乎没有让您能够通过联接进行过滤。 NSPredicate's
不是完整的SQL,所以我可能在那里咆哮错误的树。我正在努力避免使用没有CoreData的SQLite重新实现我的应用程序,因为我很享受CoreData在其他领域给我的性能。是的,我确实考虑过(并构建了一个测试实现)潜入CoreData生成的原始SQLite,但这不是未来的证据,我也想避免这种情况。
是否有其他人尝试使用UITableView
NSFetchedResultsController
来解决使用CoreData进行标记/过滤的问题
答案 0 :(得分:9)
首先,您实际上不需要Item_Tags
实体。核心数据能够模拟多对多关系,而无需中间实体。你可以拥有一个多对多tags
关系,它具有倒数到多items
的关系,而核心数据将会在幕后发挥作用。
因此,要设置获取请求以执行您描述的操作,您可以执行类似的操作。假设您有tag
表示要过滤的标记。写一个这样的谓词:
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"%@ IN tags", tag]];
这将为您提供一个谓词,该谓词仅返回在Item
关系集中tag
的{{1}}。很简单,对吧?
请记住:核心数据不是数据库。这是一个对象图管理系统。它在幕后使用SQL的事实真的不应该影响你使用它的方式。