2011-10-02 16 views
9

ユーザーがサーバーからデータセット(データテーブル)をダウンロードしてデバイスに保存できるiPad /タブレットデバイス用のオフラインHTML5 Webアプリケーションを構築する必要があります。ユーザーは、サーバーから切断して、デバイス上でローカルにデータを表示/編集することができます。これは、セルラーカバレッジがなく、データを収集/更新する必要のある遠隔地で働く人々のためのものです。彼らはオフィスに戻ってくると、データをサーバーに同期/アップロードすることができます。それがHTML5である必要がある理由は、HTML5をサポートする最新のWebブラウザを持っている限り、それはプラットフォームにとらわれない、つまりiOS、Androidなどで実行できるということです。IndexedDBのラッパー関数

私は既にHTML5ローカルストレージ(データ用)とHTML5オフラインアプリケーションキャッシュ(ページ/ CSS/js /イメージ用)を使用してシステムを構築しましたが、小さなデータセットではうまく動作しますオフラインでの編集と保存、オンラインでの読み込み/同期)。今では、最大10,000行のデータをスケールする必要があります。それは動作しますが、かなり遅く、インテルのクアッドコア8GBマシンにロードしている間、ブラウザを10秒間停止します。

だから私は、ローカルストレージよりも、いくつかの優れた選択肢を研究してきました:

1)WebSQL:SQL言語を使用してデータを照会することができるとどうなるなどに参加する問題は、それが今ではないでしょう廃止予定ですです私はそれ以上何かを構築するための時間を費やしたくないので、これ以上サポートすることはできません。

2)IndexedDB:オブジェクトストア(技術的には、ローカルストレージAPIを使用してオブジェクトを保存していて、JSONを使用して保存しています)を使用します。 SQL Liteバックエンドでインデックスを使用するため、潜在的に高速です。データベースの作成、追加、読み込み、反復処理などの簡単な作業を行う定型コードが多数あります。私はちょうどselect(xyc, abc).where(abc = 123).limit(20)のような簡単なクエリをしたいのですが、その代わりにそれを行うために多くのJavaScriptコードを書く必要があります。どのようにしてテーブル間の結合を行うための独自のコードを作成しますか?

jQuery pluginが見つかりました。 IndexedDBの苦労を緩和する他のライブラリやライブラリがありますか?

多くの感謝!

+1

WebSQLがIndexedDBに賛成して放棄されたと私は信じています... –

+1

WebSQL、Apple 5.0.1はもはやWebSQLデータを保持しません。言い換えれば、これはあなたのアプリのローカルデータベースを損なうでしょう。 Phonegapには回避策があります。 https://issues.apache.org/jira/browse/CB-330 – Wytze

答えて

1

あなたは[Lawnchair] [1]と考えましたか?基礎となるストレージからの素晴らしい抽象化を提供し、データのクエリ、集約、およびページ付けのためのプラグインもあります。クエリの例として:

// basic searching 
    this.where('record.name === "brian"', 'console.log(records)') 
    this.where('record.name != ?', username, 'console.log(records)') 

    // sorting results 
    this.where('name === "brian"').asc('active', 'console.log(records)') 

私が見ることができる唯一の潜在的な欠点は、移行を処理するために表示されず、一般的なあることはインデックスの作成など

の方法を持っているように見えていないということです結合に関しては、IndexedDBはリレーショナルデータベースではなく、ドキュメント指向の(SQLなし)ストアとして設計されていますが、これは一般的なシナリオであるため、2つのオプションがあります: 2)上記の処理が遅すぎる場合は、専用キー値オブジェクトストアを作成して、関連するストアでインデックス付き検索を行うために使用されます。あなたが持っている参加要件の数に応じて、これは雑用かもしれません。

+0

ありがとう@Sidebp私はそれを見ました。デフォルトではローカルストレージをサポートしているようです。私はそれがWebSQLをデフォルトで行うのがもっと速いので好きですが、アダプターの順序を変更するオプションはないと思います。 WebSQLは2秒未満で200,000行を照会できます。 IndexedDBは15秒かかります。ローカルストレージは約10,000行後にハングします。 – zuallauz

4

私は、IndexedDBとWebSqlの両方をサポートするオープンソースweb database wrapperを持っています。

バージョン移行は意味がありません。以下のコードの移行(または初期化)バージョン2

schema_ver2 = { 
    version: 2, 
    size: 2 * 1024 * 1024, // 2 MB 
    stores: [{ 
     name: 'ydn_obj', 
     keyPath: 'id.value', 
     indexes: [{ 
      name: 'age', 
      type: 'INTEGER' // type is require for WebSql 
     }] 
    }] 
} 
db = new ydn.db.Storage('db name', schema_ver2) 

Queryに非常に柔軟で強力です。年齢がインデックス化されている場合、より効率的なキー範囲クエリで再び

q = db.query('customer').when('age', '>=', 18 , '<', 25).where('sex', '=', 'FEMALE') 
young_girls = q.fetch(10, 2); // limit and offset 

:たとえば

q = db.query('customer', 'age').bound(18, 25, true).where('sex', '=', 'FEMALE') 

またtransactionをサポートしています。

p123 = db.tkey('player', 123); 
db.runInTransaction(function() { 
    p123.get().success(function(p123_obj) { 
     p123_obj.health += 10; 
     p123.put(p123_obj); 
    }); 
}, [p123]); 
0

私はJsStoreがうまくいくと思います。

クエリがSQLで次のようになりますと言うことができます - どこJsStoreではcolumn1 = 'ABC' の限界20

がTABLE_NAMEから選択* - それは

var Connection = new JsStore.Instance("YourDbName"); 
Connection.select({ 
    From: "table_name" 
    Where: { 
     Column1: 'abc', 
    }, 
    Limit:20, 
    OnSuccess:function (results){ 
     console.log(results); 
    }, 
    OnError:function (error) { 
     console.log(error); 
    } 
}); 

になりますので、あなたがJsStoreを使用してSQLのようなクエリを書くことができます。

関連する問題