【问题标题】:Fetch Data According To Specific Entity根据特定实体获取数据
【发布时间】:2013-08-12 14:05:30
【问题描述】:

我正在使用神奇的记录从核心数据中获取数据,使用代码:

- (NSFetchedResultsController *)fetchedResultsController {
    if (!_fetchedResultsController ) {
        _fetchedResultsController = [TagItem MR_fetchAllGroupedBy:nil withPredicate:nil  sortedBy:@"name" ascending:YES delegate:self];
    }

    return _fetchedResultsController;
}

问题是,它正在填充由另一个表视图控制器推送到的表视图控制器,所以基本上用户选择一个选项,将人带到数据列表,但选项中的数据特定于那个选项。所以我想做的是只获取分配给该选项的数据,而不是简单地显示所有可用数据。我上面的方法只允许我获取所有数据,而不是根据选项选择特定数据。选项中的数据作为一个实体被赋予选项本身的 objectId,从而提供了两者之间的关系。

所以我的问题是,如何使用魔法记录根据特定实体获取数据?

更新

我尝试将谓词设置为特定值只是为了测试它是否有效,我认为它与单独处理核心数据的工作方式相同,但我只是得到一个错误。

- (NSFetchedResultsController *)fetchedResultsController {
    if (!_fetchedResultsController ) {
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = test"];
        _fetchedResultsController = [TagItem MR_fetchAllGroupedBy:nil withPredicate:predicate  sortedBy:@"name" ascending:YES delegate:self];
    }



return _fetchedResultsController;

}

错误如下,即使我确定有一个名称为test的数据项存储,但它似乎不起作用。

'NSInvalidArgumentException',原因:'无法为谓词(名称 == 测试)生成 SQL(RHS 上的问题)'

【问题讨论】:

  • 测试谓词中的引用错误:[NSPredicate predicateWithFormat:@"name = 'test'"] 或更好:[NSPredicate predicateWithFormat:@"name = %@", @"test"]

标签: ios objective-c core-data nsfetchedresultscontroller magicalrecord


【解决方案1】:

这就是withPredicate 参数的用途:

NSPredicate *predicate = ... // predicate that filters the items to display
_fetchedResultsController = [TagItem MR_fetchAllGroupedBy:nil withPredicate:predicate ...];

例如,如果 TagItemPerson 具有一对一的关系 person,那么

Person *person = ...; // person selected in the first view controller
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"person = %@", person];
_fetchedResultsController = [TagItem MR_fetchAllGroupedBy:nil withPredicate:predicate ...];

将获取与该人相关的所有项目。

【讨论】:

  • 所以这是我的愚蠢认识,你不能简单地在谓词中输入实体的名称。非常感谢,如果我这样做,它会起作用! :D
  • @AlexSaidani:你可以(用正确的引用),看看我对你的问题的评论。
  • 它与上述问题无关,但哪个更快:- 执行 predicate where person={person object} or person.field={some value} ?我个人的想法是第二个选项会更快,因为 Core Data 只需要比较一个字段,而对于第一个代码,它将比较所有属性。但是,我不确定
  • @Max: "person={person object}" 不比较所有属性。相关对象在 SQLite 表中存储为一列(如“外键”),我认为这将比需要字符串比较的“person.field={some value}”更快。您可以在启动参数中添加“-com.apple.CoreData.SQLDebug 1”,然后您将看到所有执行的 SQLite 语句以及时间信息。
  • @Martin R:- 谢谢。我比较了这两种方法。 person.field 方法在其索引字段上生成了与我的其他表的连接。并且“person ==”方法没有生成任何连接……现场方法花费了 0.0201 秒,而第二种方法花费了 0.0278 秒。虽然 person 表中没有数据(:))。但是,至少我现在知道这两种方法之间的区别
猜你喜欢
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 2020-07-08
  • 1970-01-01
相关资源
最近更新 更多