1

我有一个关于在 NSPredicate 中使用获取的属性的问题(见下文“我的问题”)。这与获取获取的属性的谓词无关。为了澄清和其他可能也面临这个问题的人,我尝试制作一个小型示例项目。

示例项目

使用 Fetched Properties 的需求来了,因为我的应用程序因违反 iOS 数据存储指南而被拒绝。他们在QA1719中写道:

应用程序应避免将应用程序数据和用户数据混合在同一个文件中。

我认为这对于更轻松的 iCloud 同步可能是必要的,也可能有助于迁移。

那么,如何做到这一点呢?

我使用了一个预加载的 sqlite 数据库,我在第一次启动时从包路径中复制了该数据库,并用于保存用户编辑。因为您不应该混合预加载数据和用户数据,所以我试图将它们分开。

主要问题是,不可能在不同的商店之间建立关系(跨商店关系)。

我还没有找到 Fetched Property Project 的样本,所以我在这里尝试自己制作。

对于示例,有:

  1. 存储在持久存储 Books.sqlite 和
  2. 一种使书籍成为您最喜欢的书籍的方法。这存储在持久存储 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"]
4

2 回答 2

0

子查询需要我们这里没有的关系。所以这在我看来是行不通的。您可以切换 fetchedResultsController 中的实体,通过 fetched 属性检索您需要的数据到相关的书籍对象。如果为了节省时间,您可以(就像您已经做的那样)存储最相关的数据,以便在您最喜欢的对象内的 tableview 中显示,并且仅当用户选择一个单元格并且您进入详细视图时才检索其他数据。

于 2012-06-27T08:03:06.400 回答
0

我使用了一个预加载的 sqlite 数据库,我在第一次启动时从包路径中复制了该数据库,并用于保存用户编辑。

自带预加载数据本身并没有什么问题。您可能应该只在捆绑包中提供一个 JSON 文件,并在初始应用程序加载时对其进行解析并将其导入 Core Data。这将简化您尝试做的事情,并且不会对 Apple 产生反感。如果您这样做,您的其余问题将变得无关紧要。有不止一种方法可以做到这一点。

另外,您是否有理由将“收藏”设为自己的实体?为什么不能在名为“isFavorite”的图书实体上创建一个布尔值?

于 2012-06-08T17:16:11.027 回答