8

これはかなり面白いです。私のアプリケーションでは、データベースに何千ものエントリを作成します (別のスレッドでは、MagicalRecord を使用しています)。すべてが正常に機能しているようです (バックグラウンド/フォアグラウンド/コンテキストの観点から)。

メインスレッドで「挿入したばかり」のデータをフェッチしようとすると、次の動作が見つかりました。

- (NSArray *) familiesInCompany:(Company *) company {
  NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"company == %@", company];
  NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"company.name == %@", company.name];

  NSArray *first = [Family MR_findAllSortedBy:@"name" ascending:YES withPredicate:predicate1];
  NSArray *second = [Family MR_findAllSortedBy:@"name" ascending:YES withPredicate:predicate2];
  NSArray *third = [Family MR_findByAttribute:@"company" withValue:company andOrderBy:@"name" ascending:YES];

  return second;
}

今私が得るものは次のとおりです。

  • 最初: 空の配列です
  • 2 番目: 期待どおり、すべてのFamilyオブジェクトが含まれます
  • 3 番目: 空の配列です。

SQL ステートメントをデバッグすると、次のようになります。

「最初の」ステートメント:

CoreData: 注釈: 合計フェッチ実行時間: 0 行で 0.0000 秒。

「2番目の」ステートメント」:

CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZNAME, t0.ZCOMPANY FROM ZFAMILY t0 JOIN ZCOMPANY t1 ON t0.ZCOMPANY = t1.Z_PK WHERE t1.ZNAME = ? t0.ZNAMEによるオーダー

CoreData: 注釈: SQL 接続フェッチ時間: 0.0005 秒

CoreData: 注釈: 合計フェッチ実行時間: 2 行で 0.0007 秒。

「3番目の」ステートメント:

CoreData: 注釈: 合計フェッチ実行時間: 0 行で 0.0000 秒。

面白いのは、アプリケーションを閉じて (実際には手動で終了するということです)、再び開くと、3 つの「フェッチ」ステートメントがすべて機能することです。

最初と 3 番目の fetch ステートメントが実行されていないように見えるのはなぜですか? 問題をどう掘り下げるか?

4

1 に答える 1

8

私はこれと同じ問題を抱えていました。これが私が理解したことであり、どのように解決したかです。

Magical Record はNSManagedObjectContextデフォルトの親としてルートを持っていますNSManagedObjectContext。デフォルトのコンテキストでを作成するNSFetchedResultsControllerと、あなたと同じようにすべてがうまくいくようです。

問題は、すべての新しい NSManagedObjectが、まだ一時的な で戻ってくることObjectIDです。したがって、私の場合、 を使用しNSPredicateて、関連付けられたテーブルに対するクエリのスコープを設定していました。すべてをメモリにロードするのではなく、変更を処理したかったので、関連付けメソッドを呼び出すだけではありませんでしNSFetchedResultsControllerた。

一時的なObjectIDクエリを使用すると、結果がゼロになり、それがまさに表示されます。

子コンテキスト (デフォルト) は、バッキング ストアに永続化されているにもかかわらず、一時的でない ID への変換の利点を得られないようです。

で問題を強制しようとすると、さらに悪いことが起こりましたobtainPermanentIDsForObjects:error:。Core Data は、私のインスタンスの障害を満足できないと訴えました。気にしないでください、それが実際に過ちだった方法はありません。オブジェクトを単に更新しても効果はありませんでした。これは Core Data のバグであり、関連付けメソッドを使用して NSSet を取得するだけなので、ほとんど誰もくすぐらないと思います。

私の修正はNSFetchedResultsController、この質問のように、Magical Record、保存、および NSFetchedResultsControllerの親コンテキストを使用することでした。

編集時に新しい子コンテキストでデフォルトをすでにラップしていたので、インスタンスをその編集コンテキストに でコピーしていたので、引数createInContextに追加する以外に追加の作業を行う必要はありませんでした。.parentContext

ちなみに、これは関連付けのソースの新しいインスタンスでのみ発生しました。インスタンスが起動時からそこにあると、一時的ObjectIDではなく、問題が発生することはありませんでした。

于 2012-07-10T05:56:06.220 に答える