これは重複したスレッドのように見えるかもしれませんが、私の質問は、次のような多くの質問を読んだことです。 コアデータvs SQLite 3 FMDBはiOSではサポートされていなかったため、FMDBが開発されたため、今後は使用しないでください。データベースとしてのコアデータ。
オブジェクトストレージにコアデータを使用するかどうかにかかわらず、私はひどく混乱しています。どの基準を使用するかを決定する必要があるということですか? Appleまたは他の誰かが提供するガイドラインはありますか?それとも時間とともに私に来るものですか?
アンキット、
これが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を使用することで生産性の重要な利点が得られます。
アンドリュー
私は最近この旅に乗り出し、結局3つすべてを試してみました。これが私が学んだことです:
NSDictionary
を提供します。各アイテムは、適切なデータ型の可変バリアントに自動的に型キャストされます(たとえば、テキスト列はNSMutableString
として返されます)。さらに抽象化するために、その周りに非常に単純なラッパークラスを作成することになりました。そのため、NSArray
のNSDictionary
を返すselectAllFrom:(NSString *)table where:(NSDictionary *)conditions
などの静的関数を含むヘルパークラスがあります。 _オブジェクト。 NSArray *usersNamedJoe = [DBHelper selectAllFrom:@"user" where:@{@"name": @"Joe"}];
のようなことができるのは素晴らしいことです。基本的に、Core DataはシンプルなiOS専用アプリに役立つかもしれませんが、クロスプラットフォームデータベースの使用に興味がある人は遠く離れている必要があります-Appleはそれを簡単にすることに関心がありません、それは示しています。
TL; DR:
「INSERT
s」を頻繁に使用し、FMDBが最新の状態であるすべてのプロジェクトで、 [〜#〜] fmdb [〜#〜] を使用しています。 Githubでの最後のコミットは昨年11月でした。 SQLを使用する場合は、FMDBを使用することをお勧めします。
コアデータはすべてのプロジェクトの95%に適合しますが、壁に実行するための最適化に関しては。コアデータ(OOPなど)の利点が必要な場合は、それを使用してください。 "WHERE
"ユーザーSqlite(FMDB)を使用して多数の削除を挿入する場合
これ [〜#〜] post [〜#〜] Core Date vs. Sqlite(FMDB)のオフサイトとトップサイトを説明します
CoreDataはnotはSQLデータベースの単なる抽象化です。 CoreDataはオブジェクトグラフの管理も行います。 CoreDataは、FMDBが単純に実行できないことを実行できます。
いつものように:それは本当にあなたのユースケースに依存します。しかし、99%のケースではCoreDataが正しい選択です。
パフォーマンスが重要な場合でも、データベースの動作を理解する必要があります。しかし、CoreDataは、適切に使用すればそのパフォーマンスを発揮できます。しかし、学ぶには少し時間がかかります。 CoreDataで行うのは簡単なことで、FMDBで行うのが非常に複雑になることはたくさんあります。
新しいSQLの人として、私は2セントを投入します。
Core Dataには、実際にデータベースを使用する前に挿入する必要のある「ボイラープレート」コードが少しあります。アプリには少なくとも次のいずれかが必要です。
フレームワークを最大限に活用するには、データの管理においてこれらのオブジェクトが果たす役割を理解する必要があります。
一方、SQLiteがあります。これは、私の意見では、はるかに理解しやすいものです。まず、次のものが必要です。
Core Dataは、SQLite3データベースの単なるオブジェクトの抽象化です。つまり、標準のデータベース操作のために管理しやすい永続オブジェクトがあることになります。モデルを作成して、トランザクションモードで作業し、XCodeでコアデータデータベース構造を設計することもできます。
SQLite3データベースまたは永続メソッドを手動で作成する必要がない場合は、Core Dataを使用します。