web-dev-qa-db-ja.com

Core Data VS SqliteまたはFMDB ....?

これは重複したスレッドのように見えるかもしれませんが、私の質問は、次のような多くの質問を読んだことです。 コアデータvs SQLite 3 FMDBはiOSではサポートされていなかったため、FMDBが開発されたため、今後は使用しないでください。データベースとしてのコアデータ。

オブジェクトストレージにコアデータを使用するかどうかにかかわらず、私はひどく混乱しています。どの基準を使用するかを決定する必要があるということですか? Appleまたは他の誰かが提供するガイドラインはありますか?それとも時間とともに私に来るものですか?

36

アンキット、

これがtl; drスキニーです。CoreDataを使用してください。

これが長い形式です:

多くの基準を使用してCore Data、ORM(FMDB)、または直接sqlite呼び出しのいずれかを選択できますが、この選択の実際のコストは、それを使用する時間、Appleのサポート、および他のプロジェクトからの活用に起因します。 (RESTサービスをCore DataにマップするRESTKitは最近人気があります。)

したがって、時間の大部分、たとえば90 +%(構成された統計)と言えば、iOSでの答えはCore Dataを使用することです。どうして?慣れてきて、いくつかの小さなヘルパーメソッドを構築したら、Core Dataは一貫したコンピューティングの世界、つまりObjective-Cオブジェクトグラフにとどまります。 Core Dataは、iOSプログラミングのその他すべての側面に役立つ動的言語の使用方法について説明します。したがって、あなたはより生産的です。フレームワークと戦わないでください。

大規模で複雑なSQLiteデータベースとスキーマを別のアプリから持ち込む場合は、FMDBまたはSQLiteを使用するとコスト効率が良くなる可能性があります。しかし、私はそれを疑います。 DBをCore Data DBに移行するための簡単なMacベースのコマンドラインアプリを作成する時間は、有限で単純な作業です。 Objective-Cのほとんどのビジネスロジックを書き換えなければならないことがほぼ保証されています。 (はい、C++とObjective-C++はどちらも優れたテクノロジです。データベースのビジネスロジックは、メモリが限られたデバイスで動作するように本当に調整されていますか?私はそうは思いませんでした。)

Core Dataはパフォーマンスに不満を持っています。それは本当にかなり速いです。 DBを使用する場合とは異なる方法で使用する必要があります。特に、ほとんどの場合、ストアからデータをオーバーフェッチし、さまざまなセットや配列に直接述語を使用してデータを絞り込みます。フラッシュが驚くほど遅いiOSデバイスでは、このオーバーフェッチ戦略は特に効果的です。実際には、これらのデバイスに多くのRAM=を使用し、それを使用してパフォーマンスを向上させます(これは、上記のポータブルビジネスロジックのノックとは明らかに矛盾しています。しかし、実際にはコードが移植されています)デスクトップまたはサーバー環境からは、ディスクの速度、メモリの量、およびVMがバッキングストアであるという現実について、非常に多くの暗黙の仮定があります。ファンキーなメモリモデルのバッテリ駆動のメモリ制限デバイス。[Androidデバイスでも動作しません。))データを非正規化して、さまざまなiOSおよびMac OS X UIウィジェット。CoreDataが同等のSQLite DBよりも低速になるアプリケーションがいくつかあります。それらは他の場所で詳述されています。1つの主な主張は、IDが上流データベースによって定義されるタスクがCore Dataのパフォーマンスに影響することです。しかし、賢明なインデックス作成とオーバーフェッチによって多少軽減することができます。

モバイルデバイスについても覚えておくべきことは、データベースのサイズは、インターネットのリーフにあるモバイルデバイスであるため、一般に適度なサイズであることです。したがって、パフォーマンスは簡単に達成できます。サーバーの世界からの多くの教訓は、このモバイルのバッテリー駆動の世界には適用されない場合があります。

言い換えると、iOS/Mac OS XでObjective-Cを使用するには「オールイン」する必要があり、Core Dataを使用することで生産性の重要な利点が得られます。

アンドリュー

45
adonoho

私は最近この旅に乗り出し、結局3つすべてを試してみました。これが私が学んだことです:

  • 生のsqlite3
    • データベースへの低レベルのフルアクセス。抽象化なし。非常に冗長-非常に単純なことを行うには大量のコードが必要です。
  • コアデータ
    • 非常に高レベルで、抽象化に基づいて構築されているため、Appleが生成したデータベースを使用する必要があります。 iCloud同期とシンプルなiOSのみのデータ管理に役立ちます。データベースに直接アクセスすることは困難で危険であり、クロスプラットフォームデータベースには使用しないでください。それでも、単純なことを行うにはかなりの量のコードが必要です。
  • FMDB
    • 高レベルで、非常に抽象化に適していますが、強制されていません。必要な場合は、引き続きデータベースへのフルアクセスを取得してください。結果のNSDictionaryを提供します。各アイテムは、適切なデータ型の可変バリアントに自動的に型キャストされます(たとえば、テキスト列はNSMutableStringとして返されます)。さらに抽象化するために、その周りに非常に単純なラッパークラスを作成することになりました。そのため、NSArrayNSDictionaryを返すselectAllFrom:(NSString *)table where:(NSDictionary *)conditionsなどの静的関数を含むヘルパークラスがあります。 _オブジェクト。 NSArray *usersNamedJoe = [DBHelper selectAllFrom:@"user" where:@{@"name": @"Joe"}];のようなことができるのは素晴らしいことです。

基本的に、Core DataはシンプルなiOS専用アプリに役立つかもしれませんが、クロスプラットフォームデータベースの使用に興味がある人は遠く離れている必要があります-Appleはそれを簡単にすることに関心がありません、それは示しています。


TL; DR:

  • 非常に些細なことをしているのでない限り、生のsqlite3を使用しないでください。
  • コアデータは、簡単にiOSのみのデータにロックされていても問題ない場合は問題ありません。
  • データベースを完全に制御する必要があり、些細なことを行わない場合、または複数のプラットフォーム用にアプリを構築する場合は、FMDBが最適です。
38
alexwebb2

INSERTs」を頻繁に使用し、FMDBが最新の状態であるすべてのプロジェクトで、 [〜#〜] fmdb [〜#〜] を使用しています。 Githubでの最後のコミットは昨年11月でした。 SQLを使用する場合は、FMDBを使用することをお勧めします。

コアデータはすべてのプロジェクトの95%に適合しますが、壁に実行するための最適化に関しては。コアデータ(OOPなど)の利点が必要な場合は、それを使用してください。 "WHERE"ユーザーSqlite(FMDB)を使用して多数の削除を挿入する場合

これ [〜#〜] post [〜#〜] Core Date vs. Sqlite(FMDB)のオフサイトとトップサイトを説明します

8
CarlJ

CoreDataはnotはSQLデータベースの単なる抽象化です。 CoreDataはオブジェクトグラフの管理も行います。 CoreDataは、FMDBが単純に実行できないことを実行できます。

いつものように:それは本当にあなたのユースケースに依存します。しかし、99%のケースではCoreDataが正しい選択です。

パフォーマンスが重要な場合でも、データベースの動作を理解する必要があります。しかし、CoreDataは、適切に使用すればそのパフォーマンスを発揮できます。しかし、学ぶには少し時間がかかります。 CoreDataで行うのは簡単なことで、FMDBで行うのが非常に複雑になることはたくさんあります。

6
Daniel Eggert

新しいSQLの人として、私は2セントを投入します。

Core Dataには、実際にデータベースを使用する前に挿入する必要のある「ボイラープレート」コードが少しあります。アプリには少なくとも次のいずれかが必要です。

  1. 永続ストアコーディネーター
  2. 管理オブジェクトコンテキスト
  3. 管理対象オブジェクト。これはエンティティに相関し、SQLiteデータベースを使用する場合はテーブルに相関します。

フレームワークを最大限に活用するには、データの管理においてこれらのオブジェクトが果たす役割を理解する必要があります。

一方、SQLiteがあります。これは、私の意見では、はるかに理解しやすいものです。まず、次のものが必要です。

  1. データベース
  2. テーブル以上(データによって異なります)
  3. SQLの知識-単純な構文を持つ柔軟な言語(SELECTクエリは、当初考えていた以上のことを行います)
  4. アプリがSQLiteと通信するためのオブジェクト。
2
moonman239

Core Dataは、SQLite3データベースの単なるオブジェクトの抽象化です。つまり、標準のデータベース操作のために管理しやすい永続オブジェクトがあることになります。モデルを作成して、トランザクションモードで作業し、XCodeでコアデータデータベース構造を設計することもできます。

SQLite3データベースまたは永続メソッドを手動で作成する必要がない場合は、Core Dataを使用します。

0
Stefan Ticu