2017-07-13 11 views
2

いくつかのCore Dataオブジェクト(異なるエンティティの束)を含む辞書を保存したいと思います。また、オブジェクトにはかなりの数の関係(および逆の関係)が定義されています。それについて最善の方法は何でしょうか?コアデータオブジェクトの束を含む辞書を保存する最も良い方法は?

NSKeyedArchiverを使用してファイルに書き込もうとしました。私はそれぞれ、オブジェクトの束を持って詳細

- それは素晴らしい作品ながらNSKeyedUnarchiverを使用してファイルから読み取るしようとしたとき、それは誤り

-[SomeEntity initWithCoder:]: unrecognized selector sent to instance 

EDITとクラスのいずれかに障害が発生しましたそれらに基づいてフィルタリングすることができる特性を有する。これらのプロパティは、複雑な構造を持っているため、Core Dataエンティティオブジェクト自体にあります。

ユーザーが選択したフィルタを保存して、次にオブジェクトを表示するときに、そのオブジェクトを以前の選択に従ってフィルタリングすることができます。

フィルタA、B、Cの3つのフィルタがあり、それぞれ5つの異なる値があるとします。ユーザは、フィルタA1、A2、B1およびC3(または異なる組み合わせ)を選択することができる。私の質問、コアデータを使用して、これらの選択したフィルタ(この場合A1、A2、B1、C3)を保存するにはどうすればよいですか?

+0

失敗したクラスは、あなたが作成したカスタムクラスでなければなりません。つまり、これらの2つのメソッドinitWithCoder:とencodeWithCoder:を適切にアーカイブしてアーカイブを解除するために実装する必要があります。それらを実装したら、そのエラーを止めるべきです。その場合は – Pochi

+0

@ポチで、なぜアーカイブは正常に進むのですか?それも失敗してはいけませんか? – user3539959

答えて

1

は、私はあなたの質問を理解していれば、私は見てみましょう:あなたは既に保存されているmanagedObjectsのコレクションを持っているが文脈それらはすでにSQLデータベースに保存されている可能性があります。他の目的のために、そのコレクションALSOを別のファイルに保存したいとします。すでにこのコレクションの情報を何らかの方法でコアデータに保存しておき、すでに拒否していると考えています。また、現在の状態でデータベースの状態を保存するためにクエリ生成トークンを保存することも考えられましたが、それはあなたが望むものでもありません。ポイントは、その目的のためにすでに設計されているSQLデータベースを使用せずにデータを取得できるように構成されたmanagedObjectの一部を含むファイルを持つことです。

解決策1:各管理対象オブジェクトを辞書に入れます。

あなたは、管理対象オブジェクトのentityを取得して、エンティティのattributesByNamerelationshipsByNameプロパティにアクセスすることで、すべての属性とすべてのオブジェクトのすべてのプロパティを取得することができます。そこから、各プロパティを辞書に入れる単純なループを作成します。また、関係をエンコードする際に、objectIDを格納してobjectIDをポイントすることをお勧めします。次に、辞書内のmanagedObjectを、すべての属性と関係を含む辞書に置き換えます。この新しい辞書は、アーカイブやアーカイブを簡単に行うことができます。

これは、アーカイブを解除するときのデータが、あなたがそのデータを残した方法と同じであることを確認します。アーカイブを解除すると、データのCOPYが取得されます。その後、データベース内で管理対象オブジェクトが変更された場合、OLD値が取得されます。また、これらのコピーは、管理オブジェクトコンテキストに接続されていないため、コアデータオブジェクトではありません。

解決策2:管理対象オブジェクトのObjectIdを保存するだけです。

コレクション内のすべての管理オブジェクトをオブジェクトのobjectIdに置き換えます。この辞書は簡単にアーカイブすることができます。アーカイブを解除すると、すべてのobjectIdが、コンテキストでexistingObjectWithID:を使用するコアデータオブジェクト(見つかった場合)で置き換えられます。エンティティが削除された場合、エンティティを元に戻すことはできません。エンティティが変更された場合、新しい値が取得されます。

解決策3:この

のいずれかを実行しないでくださいあなたのコア・データがすでにデータベースに保存されている認識していないことを私には思えます。マネージオブジェクトのコレクションがある場合は、データベースから再作成できるはずです。あなたができない場合は、それを可能にするプロパティおよび/または関係を追加する必要があります。

+0

ありがとう、それは私が必要なものをかなり要約します。はい、私はコアデータdbのデータを持っています。ここでの問題は、辞書には異なるエンティティオブジェクトのコレクションがあるため、SomeEntity1、SomeEntity2 ...があり、SomeEntity1とSomeEntity2の3つのオブジェクトが1つしかないことがあります。それは動的に構築されます。 TBH私はこの動的な性質のため、これらをCoreDataにどのように保存するべきか分かりません。あなたが私をそこで助けることができれば、私は感謝するでしょう! – user3539959

+0

詳細を知らないのは難しいです。 –

+0

質問があれば編集しました。ありがとう。 – user3539959

0

このようにしてみてください。

ARCHIVE:

NSDictionary *yourDictData = [NSDictionary dictionaryWithObject:json forKey:@"key"]; // This is for example. Here you have to replace ur dictionary 
NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:yourDictData]; 

アーカイブしない:

NSDictionary *myData = [NSKeyedUnarchiver unarchiveObjectWithData:yourDictData]; 
+0

ありがとう、構文は問題ありません。問題はありません。保存しないと問題が発生します。 – user3539959

+0

ちょうどこれに従ってください:https://stackoverflow.com/questions/17519572/unrecognized-selector-sent-to-instance-for-nskeyedunarchiver –

関連する問題