4

バックグラウンド

2 つのストア (データ用の 1 つのリポジトリとユーザー データ用の 1 つのストア) で構成されたコア データ データベースがあり、フェッチされたプロパティによってそれらの間がリンクされています。

それらの間の関係が 0 対 1 であるような 2 つのエンティティがあるとします。 カード 0 ----> 1 CardStatus

1) Card、参照データといくつかのプロパティ (externalKey、word、description など) を含む

Fetch Properties - userData (CardStatus を指し、externalKey を使用して 2 つのエンティティ間のリンクを行います)

2)各カードのステータスを含むCardStatus 。このエンティティは、ユーザー データ ストアに格納されます。

カードのステータスに基づいてカードをフェッチする必要がある場合があります (例: 期限切れのマークが付いているすべてのカードを取得する、新しいマークが付いているすべてのカードを取得するなど...)。

質問

CardStatus エンティティの値に基づいて Card エンティティを取得するには、どのような述語を記述すればよいですか?

取得したプロパティ 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"];

なにか提案を?

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 に答える