web-dev-qa-db-ja.com

オフラインアクセス-SQLiteまたはIndexed DB?

私はアプリケーション開発の研究開発段階にあり、次の重要な要件があります。

  • HTML5 Webアプリケーション -ハイブリッドバージョンも含まれます
  • フォームデータは、インターネットに接続されていない場合、ローカルに保存されます

クォータの制限のため、Webストレージを使用できません- SQLiteIndexed DB を比較しています。

  • SQLiteが最適と思われますが、非推奨です
  • インデックスDBは良い代替手段ですが、 Safari のサポートはありません-ハイブリッドアプリケーションは、iPadとAndroidデバイスで将来的に実行される予定です。

APIの選択に困惑しています。 SQLiteに代わる他の方法や、Safariで予想されるIndexed DBのサポートはありますか?

24
Taha

IndexedDBを放棄することは悪い考えだと思います。これはおそらく将来の形式であるため、SafariがWebSQLのサポートを停止する可能性があるためです。

2つの間のギャップを埋めるためのさまざまなJavaScriptソリューションがあるようです-ユーザーのブラウザーで利用可能な方の節約: IndexedDBとWebSQLをブリッジするJavaScriptライブラリ これはおそらく最良のソリューションだと思います。

14
Robin Winslow

まず第一に、W3Cで廃止されたのはSQLiteではなくWebSQLです。

IndexedDB-

  • 多くのタイプのモバイルOSと互換性がなく、特定のタイプのバージョンのモバイルOSとのみ互換性があります
  • 開発者はIndexedDBでSQLを使用できません。彼らはSQLiteとWebSQLでできます
  • ほとんどの開発者は、可能な限りIndexedDBの使用を積極的に避けています

WebSQL-

  • W3Cで非推奨になりました。つまり、保守も開発もされていません。
  • モバイルアプリケーションがGoogleなどの一般的なモバイルOSで動作できるようにするには、Polyfillと呼ばれる別のプラグインが必要ですAndroid and Apple iOS

SQLite-

  • Googleから表彰されました
  • SQLiteの公式Webサイトがあります。 IndexedDBとWebSQLは
  • Googleでは、SQLiteは430万件の結果を返します。 WebSQLは700K未満の結果を返し、IndexedDBは282Kの結果を返します。

SQLiteの簡単なチュートリアルが必要な場合は、

AndroidおよびPhonegap を使用したSQLiteデータベースのストレージ

15
KershawRocks

はい、IndexedDB APIは優れており、すべてのブラウザが近い将来サポートする予定です。

私は間違いなく自分のソリューションをお勧めします https://bitbucket.org/ytkyaw/ydn-db これはIndexedDBの非常に薄いラッパーであり、Safliteの場合はSqliteにフォールバックします。

5
Kyaw Tun

IndexedDBは将来的にサポートされるデータベースである可能性が高く、WebSQLの代わりにそれを使用するのが最善です。レイモンドが指摘したように、デスクトップとモバイルの両方のブラウザーで現在/将来のサポートを確認するには、 http://www.caniuse.com を参照するのが最善です。

ソリューションの現在のニーズに応じて、 local storage を使用してクエリインターフェイスを提供する、利用可能な多数のJavaScriptライブラリの1つで問題ない場合があります。私にとってうまくいったライブラリの1つは Lawnchair です。

3
Romin

IndexedDBとWebSQLのどちらかを選択したくない場合は、JavaScriptライブラリ PouchDB を使用できます。

私はそれをAndroid Webviewで使用してオフラインデータを保存し、それはかなりうまくいきます。インターネット接続が利用できず、同期されている場合、データはローカルデータベースに保存されます(IndexedDBまたはWebSQLを使用)利用可能な接続がある場合、リモートデータベース( CouchDB データベース)を使用します。

PouchDBはIndexedDBに依存しますが、IndexedDBがサポートされていない場合は WebSQLにフォールバック します。 Cordova/PhoneGapのSQLiteプラグインを使用する可能性もあります。

2
hadrienj

あなたがwebsql、localStorage、indexedDBのテーマについて調査した場合、グーグルがこの質問に私たちを案内するので、私はこの質問を更新するために少し編集したかったのです。編集が拒否されたので、回答として投稿しています。

他の人が回答で述べたように、IndexedDBはそのドキュメントと仕様について、サポートとWeb上のコンテンツについて少し前に欠けていました。

しかし、IndexedDBのサポートは モバイル向けに大幅に改善されました です。それは非常に改善され、サポートもまったくないブラウザはOpera Mini、 ただし、市場での使用率は0,34%のみ です。

2015年の時点で、WebSQLが非推奨となり、IEであり、Firefoxがサポートを停止したため、IndexedDBに移行することをお勧めします(これだけで、市場での使用量の15%以上です!) SQLiteは急速に領域をIndexedDBに失っており、これは現在、非常に優れています ドキュメントソースmany一部の公式も !。 [〜#〜] ibm [〜#〜] のように、使用の動機付けもします。

使うつもりで今のところ問題はありません。 Safariはそれにサポートを追加し、すべての主要なブラウザも同様です。頑張れ!

編集:個人的な補遺:IndexedDBを試しました。私は私のチームのシニアです。IndexedDBの構文は、小さなストレージの問題に対しては、複雑すぎて複雑です。localstorageを使用して、単純なJSONデータを保存し、必要に応じて解析しました。私のチームの誰にとってもそれを手に入れる方がずっと良い(もちろん私も!)

2
Malavos

他の人が指摘したように、この質問が行われたため、webSQL 非推奨になりました 、IndexedDB実装 現在、すべての主要なブラウザーベンダーに存在しています

ですから、ここで同じ決断を迫られることに気付いた人は、IndexedDBを使用してください。

ここの他のものも、2つのタイプのデータベース間で選択を行う必要がないことを正しく示唆しています。クライアントマシンで利用可能なデータベースを利用するライブラリを選択(または作成)するだけです。

そのようなライブラリを探しているなら、 BakedGoods をチェックしてください。すべてのネイティブおよび一部の非ネイティブクライアントストレージ機能でストレージ操作を実行するために使用できる統一されたインターフェイスを確立します。また、それぞれがユーザーに提供する柔軟性とオプションを維持します。

それを使用すると、サポートされているデータベースの種類のいずれかでストレージ操作を実行することは問題です...

...両方のデータベースタイプに適切な操作オプションと同等の構成を指定します。

//If the operation is a set(), and the referenced structures 
//don't exist, they will be created automatically.

var webSQLOptionsObj = {
    databaseName: "Example_DB",
    databaseDisplayName: "Example DB",
    databaseVersion: "",
    estimatedDatabaseSize: 1024 * 1024,
    tableData: {
        name: "Main",
        keyColumnName: "lastName",
        columnDefinitions: "(lastName TEXT PRIMARY KEY, firstName TEXT)"
    }, 
    tableIndexDataArray: [name: "First_Name_Index", columnNames: "(firstName)"]
};

var indexedDBOptionsObj = {
    databaseName: "Example_DB",
    databaseVersion: 1,
    objectStoreData: {
        name: "Main",
        keyPath: lastName,
        autoIncrement: false
    },
    objectStoreIndexDataArray: [
        {name: "First_Name_Index", keyPath: "firstName", unique: false, multiEntry: false}
    ],
};

var optionsObj = {
    conductDisjointly: false, 
    webSQL: webSQLOptionsObj, 
    indexedDB: indexedDBOptionsObj
};

...そして操作の実行:

bakedGoods.set({
    data: [
        {value: {lastName: "Obama", firstName: "Barack"}}, 
        {value: {lastName: "Biden", firstName: "Joe"}}
    ],
    storageTypes: ["indexedDB", "webSQL"],
    options: optionsObj,
    complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});

そのシンプルなインターフェースと比類のないストレージファシリティサポートは、一部のストレージファシリティ固有の構成に対するサポートの欠如という代償を伴います。たとえば、複数列の主キーを持つWebSQLテーブルでのストレージ操作の伝導はサポートされていません。

そのため、これらのタイプの機能を頻繁に使用する場合は、他の場所を調べることをお勧めします。

ああ、そして完全な透明性のために、BakedGoodsはこの男がここで管理しています:).

1
Kevin

これはゲームに遅れるかもしれませんが、あなたは以下を見ることができます: SequelSphere

クロスブラウザで動作し、ローカルストレージを使用してデータを保持する、100%HTML5/JavaScriptリレーショナルデータベースです。 SQLを使用してクエリすることもできます。これは独自のデータベースエンジンであり、組み込み(WebSQL)リレーショナルデータベースに依存しません。そのため、すべてのブラウザーで機能します。

現在はlocalStorageのみをサポートしていますが、今後のすべての標準をサポートするという考えです。ブラウザは他のタイプの永続性をサポートしているため、SequelSphereはそれを利用します。良い点は、標準SQLを使用してSequelSphereに対してのみコーディングし、永続性を処理させることです。

それにもかかわらず、それは市場への新製品であることを認識してください。そのため、それはプラスとマイナスの両方を伴います。

1
John Fowler