9

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

これで、HTML5ローカルストレージ(データ用)とHTML5オフラインアプリケーションキャッシュ(pages / css / js / images用)を使用してシステムを構築しました。これは、小さなデータセット(表示、編集、保存が可能)で適切に機能します。オフライン中およびオンライン中のロード/同期)。次に、10,000行のデータにスケールアップする必要があります。動作しますが、かなり遅く、Intelクアッドコア8GBマシンにロードしている間、ブラウザが10秒間ハングします。

そのため、ローカルストレージよりも優れた代替手段をいくつか研究してきました。

1)WebSQL:SQL言語を使用してデータをクエリしたり、結合などを実行したりできます。問題は、非推奨になり、サポートされなくなったため、何かを構築するために時間を費やしたくないということです。

2)IndexedDB:オブジェクトストアを使用します(技術的には、ローカルストレージAPIを使用してオブジェクトを既に保存し、JSONを使用して保存しています)。SQL liteバックエンドでインデックスを使用するため、より高速になる可能性があります。データベースの作成、データベースへの追加、データベースからの読み取り、データベースの反復処理などの単純なタスクを実行するための定型コードはたくさんあります。のような単純なクエリを実行したいのですselect(xyc, abc).where(abc = 123).limit(20)が、代わりに多くのJavaScriptコードを記述して実行する必要があります。テーブル間の結合を行うための独自のコードをどのように作成しますか?

私は人生をより簡単にするかもしれない1つのjQueryプラグインを見つけました。IndexedDBを使用する際の苦痛を和らげる他のライブラリや他のライブラリはありますか?

どうもありがとう!

4

4 に答える 4

4

IndexedDB と WebSql の両方をサポートするオープン ソースのWeb データベース ラッパーがあります。

バージョンの移行はセンスの背後で処理されます。次のコードは、バージョン 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)

クエリは非常に柔軟で強力です。例えば:

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

age にインデックスが付けられている場合は、より効率的なキー範囲クエリを使用します。

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

また、トランザクションもサポートしています。

p123 = db.tkey('player', 123);
db.runInTransaction(function() {
   p123.get().success(function(p123_obj) {
        p123_obj.health += 10;
        p123.put(p123_obj);
   });
}, [p123]);
于 2012-08-21T06:25:07.733 に答える
3

linq2indexeddbを試してください。必要なクエリ インターフェイスを備えています。さらに、websql用の indexeddb shim を使用すると、WebSQL API もサポートされます。

于 2012-08-21T06:50:37.560 に答える
1

[ローンチェア][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 つのオプションがあるようです。

1) データ項目に対するカーソルの反復 2) 上記が遅すぎる場合は、専用のキー値オブジェクト ストアを作成して、関連するストアでインデックス付きルックアップを実行するために使用することもできます。参加要件の数によっては、これは面倒な作業になる可能性があります。

于 2011-10-08T17:00:06.397 に答える
0

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

クエリがSQLで次のようになっているとしましょう-

select * from table_name where column1='abc' limit 20

JsStore- それは

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のようなクエリを書くことができます。

于 2017-09-13T03:09:28.190 に答える