これは本当に奇妙な状況で、ここ数日解決するために戦ってきました。
Card
エンティティにTo-Many関係を持つエンティティがありTransaction
ます。また、Magical Recordを使用して、データストアの管理に関する定型コードを削除しています。
私の問題は次の順序で発生します。
Card
オブジェクトを作成する- 次に
Transaction
、別のビューでオブジェクトを作成します - トランザクション数を調べる
[card.transactions count]
と、サイズとして1が得られます ただし、同じコンテキストを使用してフェッチリクエストを実行すると、トランザクションは存在しません。私の述語は次のようになります。
NSPredicate * predicate = [NSPredicate predicateWithFormat:@ "card ==%@ && delete == 0"、card];
つまり、ロジックは、トランザクションを保存した後にコンテキストを保存していない可能性があると言っていますが、奇妙なことに、アプリを終了してから再実行すると、トランザクションがそこにあります。カードを作成し、アプリを終了してからアプリを実行し、トランザクションを追加すると、手順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%機能します。また、アプリを終了して再起動した後、カードに新しいトランザクションを追加するためにも機能します。