提取属性 - 谓词

时间:2012-06-08 15:34:14

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

我有一个关于在NSPredicate中使用获取属性的问题(参见下面的“我的问题”)。这不是关于获取获取属性的谓词。为了澄清和其他可能也面临这个问题的人,我试图做一个小样本项目。

SAMPLE PROJECT

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

  

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

我认为这对于更容易的ICloud同步可能是必要的,也可能有助于迁移。

那么,怎么做呢?

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

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

我还没有为Fetched Property Project找到样本,所以我在这里试图创建自己的样本。

样本有:

  1. 预先加载的书籍列表(在样本中,您使用Plus图标预加载它们),这些书籍存储在持久性商店Books.sqlite和
  2. 一种让书籍成为你最喜欢的书籍的方法。它存储在持久存储UserData.sqlite中。
  3. 实体是:

    --------------                --------------
    |   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"]
    

2 个答案:

答案 0 :(得分:0)

  

我使用过预装的sqlite数据库,我从包中复制了它   首次启动时的路径,用于保存用户编辑。

装载预装数据本身没有任何问题。您应该只在捆绑包中发送一个JSON文件,并在初始应用程序加载时,解析它并将其导入Core Data。这将简化您的尝试,并且不会对Apple产生反感。如果你这样做,你的其余问题就变得无关紧要了。这样做的方法不止一种。

另外,您是否有理由将其收藏为自己的实体?为什么你不能在名为'isFavorite'的图书实体上创建一个bool?

答案 1 :(得分:0)

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