我有一个关于在NSPredicate中使用获取属性的问题(参见下面的“我的问题”)。这不是关于获取获取属性的谓词。为了澄清和其他可能也面临这个问题的人,我试图做一个小样本项目。
需要使用Fetched Properties,因为我的应用因违反iOS数据存储指南而被拒绝。在QA1719他们写道:
应用应避免将应用数据和用户数据混合在同一文件中。
我认为这对于更容易的ICloud同步可能是必要的,也可能有助于迁移。
那么,怎么做呢?
我使用过预加载的sqlite数据库,我在首次启动时从包路径复制并用于保存用户编辑。因为你不应该混合预加载和用户数据,我试图将它们分开。
主要问题是,不可能在不同的商店(Cross-Store Relationships)之间建立关系。
我还没有为Fetched Property Project找到样本,所以我在这里试图创建自己的样本。
样本有:
实体是:
-------------- --------------
| Books | | Favorite |
-------------- --------------
- author - favorite
- title --- 1 : 1 --- - books_title
实体'Books'适用于PreloadedData,'Favorite'应包含UserData。
收藏夹标签只是一个例子,也可能是用户自制的笔记(可提供谓词)或者是否将图书租给其他人......
在我的xcdatamodeld(Xcode编辑器)中,我添加了两个配置(PreloadStore,UserStore)。每个包含仅包含所需的实体。
它们一起使用(其他一切都来自样板):
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
...
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"PreloadStore" URL:storeURL options:nil error:&error]) {
...
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"UserStore" URL:storeURLUserData options:nil error:&error]) {
我在带有谓词的书籍中创建了一个获取属性link_favorite
books_title == $FETCH_SOURCE.title
示例项目可以下载here 。它的工作原理除了Predicate(按喜欢的书籍过滤)。
我想通过那些最受欢迎的书来过滤我在图书中的提取。我尝试使用
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"favorite_link.favorite == 1"];
在MasterViewController.m
(fetchedResultsController)中,但这只会导致崩溃。
我认为我必须使用like here和COUNT或SUBQUERY,但我无法理解。
提前感谢您的帮助!
- 编辑:
我做了一个简单的NSArray fetch(核心数据),这里有以下工作:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY link_favorite.favorite == 1"];
result = [result filteredArrayUsingPredicate:predicate];
但是我如何在SUBFERY中为NSFetchedResultsController(tried this blog article)翻译它?错了是:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(contents, $x, $x.link_favorite.favorite == 1).@count > 0"]
答案 0 :(得分:0)
我使用过预装的sqlite数据库,我从包中复制了它 首次启动时的路径,用于保存用户编辑。
装载预装数据本身没有任何问题。您应该只在捆绑包中发送一个JSON文件,并在初始应用程序加载时,解析它并将其导入Core Data。这将简化您的尝试,并且不会对Apple产生反感。如果你这样做,你的其余问题就变得无关紧要了。这样做的方法不止一种。
另外,您是否有理由将其收藏为自己的实体?为什么你不能在名为'isFavorite'的图书实体上创建一个bool?
答案 1 :(得分:0)
子查询需要一个我们没有的关系。所以这在我看来不会起作用。 您可以在fetchedResultsController中切换实体,通过fetched属性将所需数据检索到相关的books对象。 如果为了节省时间,您可以(如您已经存储)存储最相关的数据,以便在您喜欢的对象中显示在tableview中,并且仅当用户选择单元格并进入详细视图时才检索其他数据。