【发布时间】:2012-06-08 15:34:14
【问题描述】:
我有一个关于在 NSPredicate 中使用获取的属性的问题(见下文“我的问题”)。这与获取获取的属性的谓词无关。为了澄清和其他可能也面临这个问题的人,我尝试制作一个小型示例项目。
示例项目
需要使用 Fetched Properties,因为我的应用程序因违反 iOS 数据存储指南而被拒绝。他们在QA1719 中写道:
应用应避免在同一个文件中混合应用数据和用户数据。
我认为这对于更轻松的 iCloud 同步可能是必要的,也可能有助于迁移。
那么,该怎么做呢?
我使用了一个预加载的 sqlite 数据库,我在第一次启动时从包路径中复制了该数据库,并用于保存用户编辑。因为您不应该混合预加载数据和用户数据,所以我试图将它们分开。
主要问题是,不可能在不同商店之间建立关系 (Cross-Store Relationships)。
我还没有找到 Fetched Property Project 的示例,所以我在这里尝试自己制作。
对于示例有:
- 存储在持久存储 Books.sqlite 中的预加载书籍列表(在示例中,您使用加号图标“预加载”它们)和
- 一种让书籍成为您最喜欢的书籍的方法。这存储在持久存储 UserData.sqlite 中。
实体是:
-------------- --------------
| Books | | Favorite |
-------------- --------------
- author - favorite
- title --- 1 : 1 --- - books_title
实体“Books”用于 PreloadedData,“Favorite”应包含 UserData。
Favorite-Tag 只是一个例子,它也可能是用户制作的笔记(可用的笔记谓词)或者如果这本书是租给其他人的......
在我的 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]) {
我在 Books with the Predicate 中创建了一个获取的属性 link_favorite
books_title == $FETCH_SOURCE.title
示例项目可以下载here。它正在工作,除了谓词(按收藏书籍过滤)。
我的问题
我想仅按最喜欢的书籍过滤我在 Books 中的抓取。我尝试使用
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"favorite_link.favorite == 1"];
在MasterViewController.m (fetchedResultsController) 中,但这只会导致崩溃。
我想我必须使用带有 COUNT 或 SUBQUERY 的 like here,但我想不通。
提前感谢您的帮助!
--编辑:
我做了一个简单的 NSArray fetch (Core Data),下面是工作:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY link_favorite.favorite == 1"];
result = [result filteredArrayUsingPredicate:predicate];
但是如何在 NSFetchedResultsController (tried this blog article) 的 SUBQUERY 中翻译它?错误是:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(contents, $x, $x.link_favorite.favorite == 1).@count > 0"]
【问题讨论】:
-
是否有机会更新示例项目的链接?
-
你有没有想过如何让它工作?我对 cross-store 和 fetched 属性有类似的问题。 stackoverflow.com/questions/16391255/…
标签: iphone objective-c core-data nspredicate fetched-property