web-dev-qa-db-ja.com

NSCodingVSコアデータ

私は、CoreData(SQLite ....)の使用に対するNSCoding(NSKeyedArchiver ...)の長所と短所を説明する記事を探していました。

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

私は今ちょっと迷っています。主な機能の違いは何ですか?

24
LolaRun

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

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

ただし、sameクラスのmanyオブジェクトがある場合は、データベースアプローチ、SQLiteまたはCoreDataを選択することをお勧めします。 CoreDataは、実質的にSQLiteのラッパーであり、データモデルの設計を大幅に容易にし、SQLステートメントを記述しなくても、カーテンの後ろでDBへのクエリを実行します。 CoreDataでクラスを定義すると、クラスの各インスタンスを永続化できます。つまり、オブジェクトのメンバーの値を常にメモリに保持しなくても取得できます。これは、多くの構造化データを格納するための非常に便利な方法です。たとえば、Webブラウザーを作成する場合は、ユーザーのブックマークを名前、URL、および最後にアクセスした時刻とともに保存できます。

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

データモデルを自分で設計する場合、plistを使用する意味はさらに少なくなりますが、誰かが私を修正してくれるかもしれません。

編集:ここに、使用方法に関するチュートリアルの短いリンクリファレンスを追加します NSCodingCore Data 、そしてボーナスとして SQLite

更新12.01.2016:永続性ソリューションを探している場合は、 レルム もチェックすることをお勧めします。

34
MrTJ

Mattt Thompsonは、NSHipsterのNSCoding、Core Data、およびNSKeyedArchiver間のさまざまな違いの消化可能な内訳を提供しています: http://nshipster.com/nscoding/

9
piperchester

オブジェクトとリレーショナル構造の間には常にインピーダンスがあります。データアクセスは通常、アプリの機能の一部であるため、私は常にオブジェクトを好みます。 NSCodingを使用すると、とにかく書くコードがほとんどなく、シンプルさ、デバッグのしやすさ、および制御が得られます。また、NSCodingをデータベース構造に組み込む柔軟性もあります。

NSCodingは、オブジェクトを保存するための永続化メカニズムです。検索最適化のためにリレーショナル構造にインデックスを追加し、オブジェクト構造を維持する場合、非常に低コストで保守が容易で、すべての世界で最高のものを手に入れることができると思います。

3
Clay

すでに優れた回答に加えて、NSCodingとNSKeyedArchiverは、NSUserDefaultsには大きすぎる(または互換性のないデータ型)が、CoreDataには小さすぎて数が少ないデータを格納するための優れた方法です。

2
Au Ris