2016-07-10 8 views
2

基本的に、私はNSManagedObjectContextから削除してコンテキストを保存した後、aのいくつかのプロパティにアクセスしようとしています。問題は、コンテキストを保存した後で、Core Dataがオブジェクトデータをfaultとしてマークし、明らかに回復できないことです。管理対象オブジェクトを削除した後のコアデータの障害

問題を再現するためにサンプルプロジェクトを作成しました。hereをダウンロードできます。

City *city = [self.cities objectAtIndex:indexPath.row]; 
[self.managedObjectContext deleteObject:city]; 
if (![self.managedObjectContext save:&error]) { 
    [self.managedObjectContext rollback]; 
    NSLog(@"Error: %@", error); 
}else{ 
    NSLog(@"%@", city); 
    // All properties of "city" are zeroed. 
    // Saved. Update data sources and animate changes... 
} 

を生成します:、次のスニペットを説明するために

<City: 0x7fe1cbd3cba0> (entity: City; id: 0xd000000000040004 <x-coredata://C1E3D3D8-188D-41DE-B701-08AF6D3E8860/City/p1> ; data: { 
    country = "0xd000000000080002 <x-coredata://C1E3D3D8-188D-41DE-B701-08AF6D3E8860/Country/p2>"; 
    name = Rosario; 
}) 

<City: 0x7fe1cbd3cba0> (entity: City; id: 0xd000000000040004 <x-coredata://C1E3D3D8-188D-41DE-B701-08AF6D3E8860/City/p1> ; data: <fault>) 

私はそれを削除した後、管理対象オブジェクトにアクセスしたい理由を、のためのデータソースとして機能NSMutableArrayを更新することですテーブルビューを作成し、ナビゲーションコントローラスタック内の以前のコントローラの別のデータソースを更新します(サンプルプロジェクトでは実装されていません)。アップラッピング

は、私の質問は以下のとおりです。

そのNSManagedObjectContextからNSManagedObjectを削除して、コンテキストを保存した後、もはや、管理オブジェクト内のデータにアクセスできることが保証されていませんか?その管理オブジェクトへの参照が保持されていても?

調査した内容に基づいて、コンテキストが保存されると、コアデータがエンティティデータを消去してメモリを節約しています。この仮定は正しいですか?このデータフォルトを引き起こしている他の要因はありますか?

ありがとうございました。

+1

なぜコンテキストを保存した後に削除されたオブジェクトにアクセスできると思われますか?データソースには 'NSFetchedResultsController'を使います。 – Avi

+0

削除されたオブジェクトへの参照は使用しないでください。 – Andy

+0

@Avi管理対象オブジェクトへの参照を保持しているためです。 – Mateus

答えて

1

NSManagedObjectは常に動的にレンダリングされます。したがって、削除された場合、コアデータはデータをフォールトアウトします。もう存在しません。本当の質問は、さまざまな配列からオブジェクトを削除する方法です。まず、必要な検索手法を使用してオブジェクトを削除する前に、オブジェクトを削除する必要があります。これは最も簡単で最も堅牢な方法です。第2に、オブジェクトポインタ自体はまだ有効であり、-removeObject:呼び出しで使用できます。しかし、私は強調することができます、これは壊れやすい解決策です。オブジェクトを削除する前に削除することを強くお勧めします。あなたの2番目の質問への答えで

は、このデータ断層運動を引き起こしている可能性がありますが、他の要因はありますか?

いいえいいえ、オブジェクトを削除すると障害が発生しています。データがこれまで利用可能であった場合、それはその実現特性であるからである。仕様の代わりに実装、特にデータベース技術を使って書くことは、あらゆる種類のライフサイクルの問題を伴います。賢い医者を引用すると、「しないでください」

+0

ありがとう!オブジェクトを削除してコンテキストを保存した後でオブジェクトを削除することをお勧めしますか? – Mateus

+0

はい、コンテキスト保存はほとんど失敗しません。基本的には、非常にまれなディスク停止で失敗します。あなたが宇宙を使い果たした場合、iOSはうまくいっています。ユーザーに早期に警​​告を出します。彼らが問題を無視すると、おそらくあなたのアプリを起動できなかったでしょう。次に、削除されたオブジェクトをゾンビとみなすべきです。あなただけがゾンビを別の方法に送ったことを知っています。ライブオブジェクトが必要です。したがって、あなたは相手先と契約を解除しています。あなたは被呼び出し者が壊れることを期待するべきです。 – adonoho

関連する問題