web-dev-qa-db-ja.com

NSUserDefaultsの制限は何ですか?

IPhoneにデータを永続的に保存するには、通常、Core Dataまたはsqlite3を使用します。ほとんどの人は、通常のデータベース(sqliteなど)として使用するのではなく、アプリケーション設定のストレージとしてNSUserDefaultsを使用することを好みます。

NSUserDefaultsには大量のデータを保存できることがわかりました。非常に使いやすく、高速です。では、これを永続的なストレージとして使用しないのはなぜですか?データベースとしてのNSUserDefaultsの制限は何ですか?

更新:
データをディスクに保存する方法は3つあります。

  • コアデータ
  • オブジェクトをplistにシリアライズする
  • NSUserDefaults

私はもうFMDB(または直接sqlite)を使用しません。各アプローチの主な長所と短所は何ですか?

私が遭遇したNSUserDefaultsのいくつかの利点:

  • NSPredicateを使用すると、並べ替え、グループ化などを簡単に行うことができます。
  • NSUserDefaultsはスレッドセーフです。
  • データをフェッチしてNSUserDefaultsに保存するには、1行かかります。
46
SEG

NSUserDefaultsは、簡単な学習曲線とスレッドセーフな実装を提供します。

それ以外の場合は、あらゆる点でCore Dataが優れていることがわかりました。特に、デフォルト値と移行ルーチンの構成に関して。

編集:結局のところ、NSUserDefaultsの「スレッドセーフ」は、メインスレッドでの操作の実行に由来するようです。これにより、私のアプリケーションの1つで深刻なフレームスキップが発生しました。 NSUserDefaultsを取り除き、ファイルにシリアル化されるスレッドセーフなNSMutableDictionaryに置き換えました。

9
lorean

Sqlite3は、大規模なデータベースを維持し、データベース要素にアクセスするために、より便利です。 Sqlite3データベースのアイテムを並べ替えることができ、Sqlite3 dtabaseでアイテムを非常に高速に検索できます。 Sqlite3データベースには、NSUserDefaultsにはなかった多くの権限があります!


NSUserDefaults vs Sqlite

NSUserDefaultsはユーザー設定用で、通常はNSStringやNSNumberなどの基本的なオブジェクトです。 Sqlite、プロパティリスト内のオブジェクトのコレクションのシリアル化、またはコアデータはすべて、作成したモデルオブジェクトなどのユーザーデータを保存するための有効なオプションです。

あなたは速度の違いを見るつもりはありませんが、それでもあなたがしていることのために正しいメカニズムを選ぶことが最善です。それが単なる設定の場合は、NSUserDefaultsを使用します。それ以外の場合は、オブジェクトをplistにシリアル化します。 Cocoaを初めて使用する場合は、最初に基本データを学ぶ機会を得るために、最初はCore DataやSqliteを回避します。


NSUserDefaultsまたはSqlite

何らかの関係で大量のデータを格納する場合、NSUserDefaultsに格納する値を少なくしたい場合はSqliteを使用します。 Sqliteはメモリを占有するため、複雑なデータを保存する必要がある場合にのみ使用してください。


NSUserDefaultsを使用して多くのゲームデータを保存する

通常、NSUserDefaultsはゲーム設定を保存するために使用されます。ゲームデータを保存するには、通常、SQLiteを使用するか、オブジェクトのNSDictionaryを作成してディスクに保存することをお勧めします。

  1. http://www.cocos2d-iphone.org/forum/topic/9308
  2. http://www.cocos2d-iphone.org/forum/topic/921
16
Viktor Apoyan

現在取り組んでいるプロジェクトでは、大きなデータベース(約400.000レコード)を設定する必要があります。 NSUserDefaultsを使用する場合は、レコードを追加する必要があります。これには数分かかる場合があります(デバイスとデータのインポート方法によって異なります)。 CoreDataを使用する場合、事前に構築されたデータベースをアプリのドキュメントディレクトリにコピーして、すぐに使用できます。

それがCoreDataに依存している理由です。

4
cem

CoreDataの利点の1つは、オブジェクトがプロパティを持つNSManagedObjectになることです。つまり、値を取得または設定すると、プロパティ名を支援するオートコンプリートが提供されます。また、コードが読みやすくなります。

一方、NSUserDefaultsでは、キーに文字列を使用して、常にキーと値のアクセサを使用する必要があります。

つまり:

myGlobalSettingsObject.lastLoginTime = @(now);

vs.

[[NSUserDefaults standardUserDefaults] setValue:@(now) forKey:@"lastLoginTime"];

誤ってどこかにキーを設定する際にタイプミスをした場合はどうなりますか?コンパイラは警告しません。誰かが間違ったタイプをどこかに入れたらどうなりますか?コンパイラは警告しません。

例えば。:

[[NSUserDefaults standardUserDefaults] setValue:@"now" forKey:@"lastLoginTiem"]; ^ ^ ^^^^

...ビルド時に警告もエラーも発生しません...危険です!

NSManagedObjectを使用する他の利点は、検証できることです。 null以外の値を確保できます。それはあなたがいくつかのクールなことをするために使用できるカスタムゲッターとセッターメソッドを持つことができます値の保存方法について何かを変更した場合、自動移行を処理できます。また、そのデータモデルはリポジトリの一部になるため、変更履歴を簡単に追跡できます。

その一方で、NSUserDefaultsは素早い動作があり、基本的な小さなアプリには最適ですが、非常に基本的なものです。小さなアプリの場合は問題ありませんが、大きなアプリがある場合は、Core Dataを使用する場合に比べて管理が難しくなります。

NSUserDefaultsについて考えられる唯一のことは、アプリがそのCoreDataストアを削除する必要がある場合、またはスレッドセーフなCoreDataの実装に煩わされたくない場合、その点でメンテナンスが少ないことです。

1
CommaToast