1

これは本当に奇妙な状況で、ここ数日解決するために戦ってきました。

CardエンティティにTo-Many関係を持つエンティティがありTransactionます。また、Magical Recordを使用して、データストアの管理に関する定型コードを削除しています。

私の問題は次の順序で発生します。

  1. Cardオブジェクトを作成する
  2. 次にTransaction、別のビューでオブジェクトを作成します
  3. トランザクション数を調べる[card.transactions count]と、サイズとして1が得られます
  4. ただし、同じコンテキストを使用してフェッチリクエストを実行すると、トランザクションは存在しません。私の述語は次のようになります。

    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%機能します。また、アプリを終了して再起動した後、カードに新しいトランザクションを追加するためにも機能します。

4

2 に答える 2

2

これはマギアレコードの問題のようです。Magical Recordの2.0ベータブランチを使用していましたが、タグ付きバージョンに戻した後、1.8.3の問題は解消されました。したがって、2.0が原因のようです。ただし、バージョン2.0がこの問題を引き起こしている理由を知ることは依然として興味深いでしょう。

マギアレコードを使用している人は、ベータ版がリリースされるまで2.0ブランチを避けることを強くお勧めします。

更新:マギアレコードの2.0ベータ版が行っていたのは、1回の保存に対して2回の保存通知を生成することでしたが、これにより、アプリに誤って2つのバージョンのカードが含まれることになりました。これにより、ログに記録していたトランザクションが最初のカードに記録されましたが、2番目のカードには明らかにトランザクションがありませんでした。次に、フェッチリクエストは、2番目のカードをフェッチし、ゼロトランザクションを返していました。アプリを終了して再起動すると、アプリはデータストアから正しいトランザクションをロードするようになり、期待どおりに機能しました。

于 2012-05-10T11:43:48.330 に答える
0

これは、のincludesPendingChangesプロパティに関連している可能性がありますNSFetchRequest。ただし、これのデフォルトはYES、保存されていない変更をすべてのクエリに含める必要があることを意味します。

メソッドが内部で何をしているのかわかりませんMR_が、setIncludesPendingChanges:ドキュメントには次のように記載されています。

特別な考慮事項

YESの値は、集計結果(maxやminなど)の計算を含む、結果タイプNSDictionaryResultTypeと組み合わせてサポートされていません。ディクショナリの場合、フェッチから返される配列は永続ストア内の現在の状態を反映し、コンテキスト内の保留中の変更、挿入、または削除を考慮しません。

だから私はMR_countOfEntitiesWithPredicateメソッドがファンキーなことを何もしていないことを確認します。- (NSUInteger)countForFetchRequest:(NSFetchRequest *)request error: (NSError **)errorコンテキストで標準メソッドを呼び出して、何が返されるかを確認してみてください。

于 2012-05-10T11:57:25.267 に答える