2012-03-05 8 views
19

CoreData(SQLite ....)の使用に比べてNSCoding(NSKeyedArchiver ...)メリットとデメリットについて説明している記事を探しています。NSCoding VSコアデータ

多くのオプションがあります。独自のカスタムバイナリリーダー/ライターを実装したり、plists/xml/jsonを使用したり、SQLiteやNSCodingを使用することができます。

私はまあまあです。 MAIN機能の違いは何ですか?

+2

重複:http://stackoverflow.com/questions/4989609 http://stackoverflow.com/questions/840634 –

+2

事はsqliteがcoredataの内側と見なされます。そしてあなたが提案した最初のリンクは、特にsqlite3とnscodingの話です。それほど多くの答えはありません。私はより一般的な質問をしています。なぜデータを処理するのは非常に多くの選択肢があるのですか? – LolaRun

答えて

30

保存するデータの種類と、内部でのみ使用するか、外部サービスとデータを交換する必要があるかによって異なります。

NSCodingは、一般にデータシリアライザです。多くのビルトインオブジェクトは、バイナリストリーム(ファイル、sqliteのBLOBなど)として保存できるNSCoderプロトコルを実装しています。NSKeyedArchiverは、文字列ラベルに基づいてそのようなストリームを検索することができます辞書のようなビットですが、文字列だけをキーとして使用できます。このアプローチは、異なるクラスのオブジェクトを永続化する必要がある場合に適しています。

しかし、あなたが同じクラスの多くオブジェクトを持っている場合、あなたはより良いデータベース・アプローチ、SQLiteのかCoreDataのために行きますよ。 CoreDataは事実上、SQLiteのラッパーであり、データモデルの設計を容易にし、SQLステートメントを作成することなく、カーテンの背後にあるDBに照会します。 CoreDataでは、クラスを定義し、クラスの各インスタンスを永続化することができます。つまり、オブジェクトのメンバーの値を常にメモリに入れずに返すことができます。これは、多くの構造化データを格納するのに非常に便利な方法です。たとえば、Webブラウザを作成する場合は、ユーザーのブックマークを名前、URL、最後に訪問した時刻で保存できます。

XMLとJSONの場合、デバイスにローカルでしかデータを使用しないと特に利点はありません。外部サービスと通信する必要がある場合は、後で使用するためにXML/JSONオブジェクトをキャッシュ/保存することを検討することがあります。他のアプローチは、必要なときに毎回内部データ構造からデータを再生成することです(上記参照)。

自分でデータモデルを設計する場合は、plistsを使用するポイントが少なくなりますが、誰かが私を修正する可能性があります。

編集:ここでは、NSCoding,Core Dataの使用方法、およびSQLiteの使用方法に関するチュートリアルの短いリンクリファレンスを追加します。

更新日12.01.2016:永続性ソリューションをお探しの場合は、Realmもお試しください。

+0

sqliteのBLOBファイルがシリアライズされている場合は、シリアライゼーションが最小のチャンクのバイナリデータを取得するのに最適です。同様に、NSCodingをconditionalObjectEncodingsに使用すると、メモリ内の生きたオブジェクトインスタンスの重複を取り除くことができます。私がこの質問をしているのは、誰もがCoredata-SQLiteを語り、提案しているからです。しかし、私は巨大なデータソースに対してビルドしない限り、そのすべてをメモリに入れることはできません。私は正しい? – LolaRun

+2

メモリとパフォーマンスの最適化は常にバランスしています。 NSCodingやカスタムのバイナリ表現では、記憶装置に書き込まれるビットやメモリに格納されるビットをより詳細に制御できますが、コードの価格をもっと支払う必要があるため、コードの効率はあなたの能力。 CoreData/SQLiteを使用すると、効率的な方法(検索、クエリ、索引付け、結合など)で多くの有益なものが実装されます。注意:CoreDataオブジェクトは、必要なときにのみメモリにロードされます。それ以外の場合は、dbに格納されます。 – MrTJ

+0

優れています。だから、アプリケーションの "ApplicationDocument"テンプレートを使用していて、ドキュメントを保存して開く必要がある場合は、CoreDataのメリットは本当に必要ありません。メモリ内のすべてをロードする必要があります。データベース機能主な違いは開発コストです。私の場合は後退ではありません。どうもありがとう。 – LolaRun

3

オブジェクトとリレーショナル構造の間には常にインピーダンスがあります。データアクセスは通常、アプリの機能のほんの一部であるため、私は常にオブジェクトを好みます。 NSCodingを使用すると、シンプルさとデバッグの容易さと、制御をほとんど行なわずに書き込むことができます。また、データベース構造にNSCodingを組み込む柔軟性もあります。

NSCodingは、オブジェクトを保存するための永続化メカニズムです。リレーショナル構造に索引を追加して検索の最適化とオブジェクト構造の維持を行う場合、非常に低コストでメンテナンスが容易で、すべての世界の中で最良のものを得ることができます。

8

マット・トンプソンがNSCoding間の様々な違いの消化性内訳、コアデータを提供し、NSHipster上NSKeyedArchiverhttp://nshipster.com/nscoding/

+1

ありがとう、これは明確な説明です。 – LolaRun

2

にすでに偉大な答えを追加するには、NSKeyedArchiverとともにNSCodingもあるデータを保存するための素晴らしい方法ですNSUserDefaultsの場合は大きい(または互換性のないデータ型)が、CoreDataの場合は小さすぎます。