【问题标题】:Fetched Properties - Predicate获取的属性 - 谓词
【发布时间】:2012-06-08 15:34:14
【问题描述】:

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

示例项目

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

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

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

那么,该怎么做呢?

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

主要问题是,不可能在不同商店之间建立关系 (Cross-Store Relationships)。

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

对于示例有:

  1. 存储在持久存储 Books.sqlite 中的预加载书籍列表(在示例中,您使用加号图标“预加载”它们)和
  2. 一种让书籍成为您最喜欢的书籍的方法。这存储在持久存储 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"]

【问题讨论】:

标签: iphone objective-c core-data nspredicate fetched-property


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答!我觉得之前还可以。现在不行了:“应用程序应该避免将应用程序数据和用户数据混合在同一个文件中。” (QA1719. ; 当然,该示例并不是我的应用程序。我目前在 Books Entity 中使用某种最喜欢的整数字段(它也适用于关系)。我也在保存其他字段。但我'想分开事物(也适用于 icloud)。这只是为了理解原理(对我来说,也许对其他人来说)。示例的其余部分有效,只有谓词丢失:(
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    相关资源
    最近更新 更多