2012-05-10 10 views
1

これは私が過去2〜3日間に解決するために戦ってきた本当に奇妙な状況です。コアデータオブジェクトが、同じセッションで作成された関連オブジェクト間のフェッチ要求を使用して表示されないのはなぜですか?

TransactionエンティティでTo-Manyリレーションシップを持つCardエンティティがあります。私はまた、私のデータストアを管理するための定型コードを削除するためにMagical Recordを使用しています。

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

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

    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%動作します。また、アプリを終了して再起動した後、新しい取引をカードに追加するためにも機能します。

答えて

2

これは魔法のレコードの問題のようです。私は2.0ベータ版魔法のレコードの支店を使用していたし、タグのバージョンに戻った後:1.8.3問題が消えます。だから2.0が原因だと思われる。しかし、バージョン2.0がこの問題の原因となっている理由を知ることは、まだ興味深いでしょう。

Magical Recordを使用している誰かがベータ版から出るまで2.0ブランチを避けるよう強く勧めます。

更新:さらに調査した後、2。Magical Recordの0ベータ版では、1回の保存で2回の保存通知が生成されていたため、私のアプリに誤って2種類のカードが残ってしまいました。この結果、私が記録していたトランザクションが最初のカードに記録されていましたが、2枚目のカードには明らかにトランザクションがありませんでした。私のフェッチリクエストは、2番目のカードを取り出して、ゼロのトランザクションを返していました。アプリケーションを終了してから再起動すると、データストアから正しいトランザクションが読み込まれ、期待どおりに処理されました。

0

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

私はMR_方法はボンネットの下に何をしているかわからないんだけど、setIncludesPendingChanges: documentation状態:

特別な考慮事項

YESの値が結果と一緒にサポートされていません。 NSDictionaryResultTypeと入力し、集計結果の計算を含めて (最大値と最小値など)。辞書の場合、 フェッチから返された配列は、永続ストア内の現在の状態を反映し、 は、 コンテキストの保留中の変更、挿入、または削除を考慮しません。

だから、私はMR_countOfEntitiesWithPredicateメソッドが何かファンキーなことをしていないことを確認します。おそらく、あなたの文脈で標準- (NSUInteger)countForFetchRequest:(NSFetchRequest *)request error: (NSError **)errorメソッドを呼び出して、それが何を返すかを見てみてください。

+0

ちょっとマイク。先端に感謝します。 Magical Recordは実際には2つのコンテキスト保存通知をトリガしていました。これらの通知を使用して、Webサービスとの同期をトリガーしました。結果として、作成されたすべてのカードオブジェクトが2つのカードオブジェクトで誤って終了していました。フェッチ要求では、間違ったカードのデータがフェッチされ、トランザクションがゼロに終わっていました。 –

関連する問題