我有一个关于在 NSPredicate 中使用获取的属性的问题(见下文“我的问题”)。这与获取获取的属性的谓词无关。为了澄清和其他可能也面临这个问题的人,我尝试制作一个小型示例项目。
示例项目
使用 Fetched Properties 的需求来了,因为我的应用程序因违反 iOS 数据存储指南而被拒绝。他们在QA1719中写道:
应用程序应避免将应用程序数据和用户数据混合在同一个文件中。
我认为这对于更轻松的 iCloud 同步可能是必要的,也可能有助于迁移。
那么,如何做到这一点呢?
我使用了一个预加载的 sqlite 数据库,我在第一次启动时从包路径中复制了该数据库,并用于保存用户编辑。因为您不应该混合预加载数据和用户数据,所以我试图将它们分开。
主要问题是,不可能在不同的商店之间建立关系(跨商店关系)。
我还没有找到 Fetched Property Project 的样本,所以我在这里尝试自己制作。
对于示例,有:
- 存储在持久存储 Books.sqlite 和
- 一种使书籍成为您最喜欢的书籍的方法。这存储在持久存储 UserData.sqlite 中。
实体是:
-------------- --------------
| 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
示例项目可以在这里下载。它正在工作,除了谓词(按收藏书籍过滤)。
我的问题
我想仅按最喜欢的那些书过滤我在 Books 中的获取。我尝试使用
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"favorite_link.favorite == 1"];
在MasterViewController.m
(fetchedResultsController)中,但这只会导致崩溃。
我想我必须使用类似 here和 COUNT 或 SUBQUERY 的东西,但我想不通。
在此先感谢您的帮助!
- 编辑:
我做了一个简单的 NSArray 提取(核心数据),下面是工作:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY link_favorite.favorite == 1"];
result = [result filteredArrayUsingPredicate:predicate];
但是我如何在 NSFetchedResultsController 的 SUBQUERY 中翻译这个(试过这篇博客文章)?错误的是:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(contents, $x, $x.link_favorite.favorite == 1).@count > 0"]