2010-12-28 10 views
29

コアデータにNSArrayを保存する方法に関するサンプルコードを探していますが、運がまだありません。誰かがチュートリアルやサンプルを指しているか、この質問の答えとして簡単なサンプルを書く方がいいでしょうか?私はthisと読みましたが、NSArrayという変換可能な属性を実装する方法の例は示していません。前もって感謝します!コアデータサンプルコードでNSArrayを保存しますか?

+0

参照してくださいhttp://stackoverflow.com/questions/29825604/how-to-save-array-to-coredata/40101654#40101654 –

答えて

25

Core DataにネイティブにNSArrayを保存しないでください。 に格納された値をの配列に変換してコアデータが使用できるものに変換し、必要に応じてNSArrayにプッシュ&プルできるようにストアにデータを保存する必要があります。

+10

コメントなしで投票しましたか?答えが実際に間違っているわけではないので、特にあまり役に立ちません。 –

+0

コアデータが使用できるものは、(すべてのNSArrayオブジェクトが同じクラスであると仮定して)多対多関係を介してオリジナルのエンティティに接続されているコアデータモデル内の別の「エンティティ」です。 –

+6

質問は、NSArrayやその他の複雑なオブジェクトをコアデータに格納するための完全に適切な方法である* transformable attributes *についてです。 – quellish

7

フィリップの答えは正しいです。配列はコアデータに格納しません。コアデータのために作られたものに全く反対しています。ほとんどの場合、配列の情報は必要ありませんが、それはコアデータによって動的に読み込まれることがあります。コレクションの場合には、どんなプロパティの配列か、取り出された結果の配列のいずれかをNSSet(基本的には配列にすぎません)に繰り返しても違いはありません。

ここではフィリップ氏の説明です。配列を直接格納することはできませんが、配列からプロパティリストを作成することはできます。すべてのNS配列型には、すばらしい清潔な文字列とコアデータの文字列を提供するメソッドがあります。文字列として格納されたプロパティリストのクールなことは、それらが元のものになることです。 NSStringにその方法があります。タタアア...

もちろん料金があります。 プロパティリストとしての配列は巨大化する可能性があり、RAMが限られているiOSデバイスではうまく機能しません。配列をコアデータに保存しようとすると、特に大規模データのエンティティ設計が貧弱であることが示されます。小さな配列はスピードの理由からOKです。

バイナリプロパティリストを使用することで、スペースの消費を抑えることができます。コアデータに格納されている場合やファイルシステムに直接格納されている場合は、ジップサイズに近づきます。欠点は、単にXMLやJSONファイルのように開いて読むことができないことです。開発のために私は人間が読めるものと、バイナリバージョンをリリースするものが好きです。プリプロセッサのDEBUG値に結びついた定数がそれを処理するので、コードを変更する必要はありません。

+1

オリジナルのポスターが投票したと仮定しないでください、すでに酸っぱいポストにタルトの味を与えます。しかし、良い説明をありがとう。 – Stunner

+3

はい、私はこれを誤訳し、より感情的に反応しました。本当に残念です。 –

1

コアデータには、NSManagedObjectのインスタンスまたは同じサブクラスが格納されます。 NSManagedObject自体は辞書に非常によく似ています。オブジェクト間の多対多の関係は集合として表されます。コアデータには配列に対応する順序付きリストはありません。代わりに、コアデータストアからオブジェクトを取得するときは、フェッチ要求を使用します。フェッチ要求は、オブジェクトをソートするために使用される1つ以上のソート記述子を指定することができ、フェッチ要求によって戻されるオブジェクトは配列に格納されます。

オブジェクトの順序を保持することが重要な場合は、オブジェクトをフェッチするときにオブジェクトをソートするために使用できる属性をエンティティに含める必要があります。

37

本当に必要な場合は、データとしてエンコードします。 NSData(バイナリデータ)としてreceiveという新しいファイルを作成しました。 NSManagedObject実装の次に

-(void)setReceiveList:(NSArray*)list{ 
    self.receive = [NSKeyedArchiver archivedDataWithRootObject:list]; 
} 

-(NSArray*)getReceiveList{ 
    return [NSKeyedUnarchiver unarchiveObjectWithData:self.receive]; 
} 
+0

True、それは文字列として保存すると良い –

+0

私にヒントを与える良いコメント。 – tounaobun

28

変形可能な属性は、(例えばNSArrayなど)コアデータにおけるさもなければサポートされていないオブジェクトの値を永続化するための正しい方法です。Core Data Programming Guide: Non-Standard Persistent Attributesから:

変換可能な属性の背後にある考え方は、非標準型としての属性にアクセスすることですが、舞台裏Core DataはNSDataのインスタンスにしてから、属性を変換するNSValueTransformerのインスタンスを使用しています。コアデータは、永続ストアにデータインスタンスを格納します。

transformable属性はNSValueTransformerを使用して、それ以外の場合はサポートされていないオブジェクトを永続ストアに格納します。これにより、コアデータにNSDataとして表現できるものを格納することができます。これは非常に便利です。残念ながら、変換可能な属性は述語で一致させることはできず、NSSQLiteStoreTypeで結果をソートする際に使用することもできません。つまり、変換可能な属性は、オブジェクトの検出ではなく、記憶域にのみ役立ちます。

デフォルトのトランスフォーマでは、NSCoding(またはNSSecureCoding)をサポートするすべてのオブジェクトを変換可能な属性として格納できます。これには、NSArray,UIColor,UIImage,NSURL,CLLocationなどが含まれます。これは、任意に大きいデータに使用することはお勧めしません。これは、ストアを照会するときにパフォーマンスに大きな影響を与える可能性があるためです。たとえば、イメージは変形可能な属性にはあまり適していません。つまり、イメージはストアを分割する大きなバイトのバイトです。その場合、Core Dataの外部レコードストレージ機能を使用するか、またはデータを別々にファイルとして保存し、そのURLをコアデータのファイルに保存する方がよいでしょう。コアデータにUIImageを保存する必要がある場合は、関係するトレードオフを確認してください。変形属性を作成

は簡単です:Xcodeのコアデータモデルエディタで

は、変更する属性のモデルを選択します。右側のインスペクタで、属性タイプを「変換可能」に設定します。 「名前」フィールドは空白のままにして、デフォルトのトランスフォーマーを使用することができます。カスタムトランスを使用していた場合は、ここにクラス名を入力し、コードのどこかに +[NSValueTransformer setValueTransformer:forName:]を使用してクラスを登録します。あなたの NSManagedObjectサブクラスヘッダに

Core Data Model Editor Transformable Attribute

•正しいタイプの変形属性を記述するプロパティを宣言。我々はNSArrayを使用しているこの場合、:

@property (nonatomic, retain) NSArray *transformedArray;

•をNSManagedObjectサブクラス実装ファイルでプロパティを動的にする必要があります:

@dynamic transformedArray;

そして、あなたが行われています。 NSArray値オブジェクトがsetTransformedArray:に渡されると、配列はオブジェクトによって保持されます。コンテキストが保存されると、Core Dataは、モデルに記載されたNSValueTransformerを使用してNSArrayNSDataに変換します。 NSDataバイトは永続ストアに保存されます。

+0

変換可能な(NSObject)をNSArrayに変換するにはどうすればよいですか? – Nil

+0

Quellish - 素晴らしい答えですが、XCodeがモデルから提供する自動生成されたカテゴリ定義を編集することなく、変換可能なオブジェクトとしてコードブロックをカバーするための答えを広げることができますか?この場所には事実上データがありません。質問者のように、私はこれを達成する方法について完全な犠牲を払っています。あなたが気にしないなら、事前に感謝します。 – VectorVictor

+0

@VectorVictor変換可能なオブジェクトとしてコードブロックが何を意味するのかよく分かりません – quellish

関連する問題