4

背景

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

假设我有两个实体,它们之间的关系是 0 到 1。 Card 0 ----> 1 CardStatus

1) Card,包含参考数据和一些属性(externalKey、word、description...)

Fetch Properties - userData (指向 CardStatus 并使用 externalKey 做 2 个实体之间的链接)

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

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

问题

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

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

由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'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"];

有什么建议吗?

4

2 回答 2

2

我找到了解决方案。

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

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

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

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

现在一切正常。

于 2013-11-10T02:30:05.780 回答
0

在我看来, CardStatus 实体可以作为某种枚举来补充动态数据存储的逻辑。我认为这不是跨商店获取的好案例。增加不必要的复杂性似乎有点矫枉过正。

相反,您可以将状态作为普通属性直接存储在 Card 实体中,可能是数字格式。如有必要,您可以使用跨存储获取从静态存储中获取状态名称。

于 2013-10-21T06:58:33.193 回答