使用fetched属性的核心数据跨存储查询

时间:2013-10-21 06:37:16

标签: ios objective-c core-data

背景

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

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

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

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

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

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

问题

我应该根据CardStatus实体的值来写入什么类型的谓词来获取卡实体?

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

  

由于未捕获的异常而终止应用   'NSInvalidArgumentException',原因:'找不到keypath userData   实体'

然后我尝试使用子查询(见下文) - 仍然无效。有趣的是,当我直接在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"];

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

我找到了解决方案。

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

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

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

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

现在一切正常。

答案 1 :(得分:0)

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

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