2012-02-24 5 views
7

Stumperを取得しました(少なくとも私にとって)。コアデータ管理オブジェクトは、再起動するまで関連オブジェクトを表示しません。Simulator

私は、iOS 5.0 w/ARCとCore DataをUIManagedDocumentの中に使用しています。

私はエンティティ(Person)に対して多対多の関係(人と呼ばれる)を持つエンティティ(グループ)を持っています。新しいグループを追加して新しいPersonを追加すると(Personの.group関係を新しいグループに設定する)、Personエンティティの述語を使用して関連する人物を検索することはできません。where( "group ==%@"、myGroup )。また、グループのaddPersonセッターを使ってみました。

XCodeシミュレータをシャットダウンして再実行すると、以前の実行で作成された関係が認識され、新しい人を既存のグループオブジェクトに追加することもできます。新しいグループを追加して、関係を見るためにSimulator(またはデバイス上で実行している場合はデバイス)をシャットダウンすることなく人を追加することはできません。

[group.people count]を実行すると、新しいグループと関連Personを追加した直後に、正しい番号が返されます。しかし、私は、アプリケーションを再起動するまで、述語でのフェッチは機能しません。

UIManagedDocumentのmanagedObjectContextがその関係を認識していないようです。コンテキストを保存し、context.parentContextを保存し、ドキュメントを保存しようとしました。それのどれも助けなかった。

いずれかのアイデアをいただければ幸いです!

+0

モデルに逆の関係を設定しましたか? – Rog

+0

はい。私はグループから人まで、人という名前の1対多を持っています。 PersonからGroupへの1対1の逆の名前付きグループ。 – Byron

答えて

10

UIManagedDocumentは基本的に、それが気に入ったら基本的に保存します。あなたはそれがいつ起こるかを制御することはできません。ただし、アプリケーションの終了時に確実に保存されるため、再起動時に挿入が表示されます。

結果として、永続的なオブジェクトIDがあると思われるかもしれませんが、実際には一時的な可能性があり、取得できません。 NSLogを介してそれらをダンプするだけで、一時的なオブジェクトIDがログに記録されるときに表示されるので、これを検証します。

これらを永続的に使用できるようにするには、追加を実行してから次の操作を試してください。あなたはIVARとしてUIManagedDocumentを持っていると仮定すると:

明らか
- (void)performUpdate 
{ 
    NSManagedObjectContext * context = self.managedDocument.managedObjectContext; 
    NSSet     * inserts = [context insertedObjects]; 

    if ([inserts count]) 
    { 
     NSError * error = nil; 

     if ([context obtainPermanentIDsForObjects:[inserts allObjects] 
              error:&error] == NO) 
     { 
      NSLog(@"BAM! %@", error); 
     } 
    } 

    [self.managedDocument updateChangeCount:UIDocumentChangeDone]; 
} 

、あなたはここで少し良く何かでエラー処理を置き換えると思います。 UIManagedDocumentは将来、ある時点で保存されるようになりました(Undo Managerと同じ方法で、最後の行でこれを行うように要求しています)しかし、新しく挿入されたオブジェクトは、永続的に使用できるようになり、フェッチは適切に動作するはずです。

これは私にとってもちょっと奇妙に思えるかもしれませんが、これはUIManagedDocumentを使って作業する正しい方法のようです。

正直言って、誰かが私に間違っていると言ってより良い解決策を提供したいと思っています。

+0

アラン、ありがとうございます!これは私に何時間もかかったり、車輪を回転させたりしていました。あなたが言ったように、これは私が読んだチュートリアルと手順のすべてから「必要な」ステップではないように見えますが、私のアプリが正しく機能しています。 – Byron

+0

誰かがこれを使用する必要性をどのように防ぐことができるかについての考えがあれば、私もそれを聞いてうれしいです。 – Byron

+0

UIManagedDocument用のアップル提供のサンプルコードがまだ存在しないことが多少はっきりしていると思います。これは、新しいネストされた管理対象オブジェクトのコンテキストの結果として意図しないバグが導入された可能性があり、サンプルコードを提供する前に修正するのを待っています。とにかく、オタクの理論。 –

-1

私は同様の問題を抱えていましたが、実行更新は私を助けませんでした。これは:

オブジェクトを挿入した後、保存する前に実行します。

関連する問題