これは私が過去2〜3日間に解決するために戦ってきた本当に奇妙な状況です。コアデータオブジェクトが、同じセッションで作成された関連オブジェクト間のフェッチ要求を使用して表示されないのはなぜですか?
Transaction
エンティティでTo-Manyリレーションシップを持つCard
エンティティがあります。私はまた、私のデータストアを管理するための定型コードを削除するためにMagical Recordを使用しています。
私の問題は、次の順序で発生します。
- は
Card
オブジェクト - を作成します。その後、私は
[card.transactions count]
とトランザクション数を検査するとき、私はサイズとして1を取得し、別のビュー - で
Transaction
オブジェクトを作成します ただし、同じコンテキストを使用してフェッチ要求を実行すると、のトランザクションは存在しません。私の述語は次のようになります。
NSPredicate *述語= [NSPredicate predicateWithFormat:@ "カード==%@ & &削除済み== 0"、カード];
だからロジックは、私はおそらく、トランザクションを保存した後、コンテキストを保存していないのですが、奇妙なことは、私はアプリを終了してから再実行した場合、トランザクションが存在することであると述べています。手順1〜4は、カードを作成してアプリを終了し、アプリを実行してトランザクションを追加すると完全に機能します。その後、私のセーブトランザクションコードは正常に動作します。
私の質問は、新しく作成された親オブジェクトでフェッチ要求を使用してオブジェクトが表示されない理由です。「新しく作成された」とは、子オブジェクトと同じセッションで作成されたことを意味します。
カードを作成するための私のコードは次のようになります。
GYCard *card = [GYCard MR_createInContext:[NSManagedObjectContext MR_defaultContext]];
[[NSManagedObjectContext MR_defaultContext] MR_save];
私はトランザクションを保存するときに私のコードは次のようになります。
NSManagedObjectContext *localContext = [NSManagedObjectContext MR_defaultContext];
NSNumber *transactionAmount = [self.numberFormatter numberFromString:self.transactionAmountLabel.text];
GYTransaction *transaction = [GYTransaction MR_createInContext:localContext];
transaction.amount = transactionAmount;
transaction.deleted = [NSNumber numberWithBool:NO];
transaction.card = self.card;
[localContext MR_save];
機能していないコードはこれです:
+ (int) countTransactions:(GYCard *) card {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"card == %@ && deleted == 0", card];
return [GYTransaction MR_countOfEntitiesWithPredicate:predicate inContext:[NSManagedObjectContext MR_defaultContext]];
}
カードが同じセッションで作成された場合、countTransactionsは常に0を返します。しかし、私がアプリをやめて再起動すると100%動作します。また、アプリを終了して再起動した後、新しい取引をカードに追加するためにも機能します。
ちょっとマイク。先端に感謝します。 Magical Recordは実際には2つのコンテキスト保存通知をトリガしていました。これらの通知を使用して、Webサービスとの同期をトリガーしました。結果として、作成されたすべてのカードオブジェクトが2つのカードオブジェクトで誤って終了していました。フェッチ要求では、間違ったカードのデータがフェッチされ、トランザクションがゼロに終わっていました。 –