ios - 使用获取的属性进行核心数据跨存储查询

标签 ios objective-c core-data

背景

我有一个由两个存储组成的核心数据数据库(一个存储库用于我的数据,一个存储用于用户数据),它们之间通过获取的属性链接。

假设我有两个实体,它们之间的关系是 0 到 1。 卡片 0 ----> 1 卡片状态

1) Card,包含引用数据和一些属性(externalKey, word, description, ...)

获取属性 - userData(指向 CardStatus 并使用 externalKey 在两个实体之间建立链接)

2) CardStatus,包含每张卡片的状态。该实体存储在用户数据存储中。

在某些情况下,我需要根据卡片的状态获取卡片(例如:检索所有标记为过期的卡片、检索所有标记为新的卡片等...)

问题

我应该编写什么样的谓词来根据 CardStatus 实体的值获取 Card 实体?

我尝试在谓词中直接使用我获取的属性 userData,但核心数据不允许这样做。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath userData not found in entity '

然后我尝试使用子查询(见下文)- 仍然不起作用。有趣的是,当我直接在 NSArray 上执行过滤器(而不是获取请求)时,它工作正常。

示例 - 检索具有特定状态的卡:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SUBQUERY(userData, $x, ($x.currentLevel == 0)).@count > 0)"];

示例 - 检索标记为新的卡片(即 CardStatus 中没有数据):

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(SELF, $x, $x.userData.@count == 0).@count > 0"];

有什么建议吗?

最佳答案

我找到了解决方案。

查询是正确的,现在工作正常。问题是我在我的线程中使用了子 managedObjectContext,而这些子上下文似乎不接受使用获取的属性。

我通过(简单地)直接基于我的持久存储创建一个新的托管对象上下文来替换它(换句话说,这个上下文和我在主线程中使用的上下文在层次结构中处于同一级别)。

下面是说明我所描述内容的代码:

AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
NSManagedObjectContext *child = [[NSManagedObjectContext alloc] init];
[child setPersistentStoreCoordinator:[appDelegate.managedObjectContext persistentStoreCoordinator]];

现在一切正常。

关于ios - 使用获取的属性进行核心数据跨存储查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19487710/

相关文章:

ios - 如何修复 "Expression type ' @lvalue CGRect/CGSize' 在没有更多上下文的情况下不明确”?

ios - 如何向 Realm 添加自动增量值

ios - ( Objective-C )在 sqlite 数据库中保存更改

objective-c - 绘制矩形看到空数组

ios - fetchRequest 返回空数组

下次我打开应用程序时,Swift Filled plist 是空的

ios - 尝试访问数据库时无法识别 Firebase 唯一标识符(用户 ID)并且应用程序崩溃? swift iOS9

ios - 自定义 UINavigationBar 的外观

ios - 将 WebView 中传入的 PDF 保存到内存

ios - Swift 2.0 中多对多 NSManagedObject 关系查找导致崩溃