ホームページ >ウェブフロントエンド >H5 チュートリアル >HTML5 IndexedDB ローカル ストレージ

HTML5 IndexedDB ローカル ストレージ

巴扎黑
巴扎黑オリジナル
2017-08-08 16:15:331714ブラウズ

IndexedDB は、大量の構造化データ (ファイル/BLOB を含む) をクライアント側でストレージするための低レベル API です。この記事では、HTML5 ローカル ストレージの IndexedDB の関連知識を紹介することに重点を置きます。興味のある方はぜひ一緒にご覧ください。IndexedDB は、大量の構造化データ (データを含む) のクライアント側ストレージに使用される低レベル API です。ファイル/BLOB)。 API はインデックスを使用して、このデータの高パフォーマンスな検索を可能にします。

最近、データをオフラインで保存し、ネットワーク信号があるときにフォームや写真をアップロードするというビジネス要件があります。そこでHTML5のIndexedDBを勉強しました。

特定のフィールドのみを保存する必要がある場合は、ローカル ストレージとセッション ストレージを使用できます。しかし、大量のデータが保存されると、ローカル ストレージとセッション ストレージではニーズを満たすことができなくなります。このとき、IndexedDBの力が反映されます。

1. データベースを作成するか開きます

/* 对不同浏览器的indexedDB进行兼容 */
const indexeddb = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.msIndexedDB;
/* 创建或连接数据库 */
const request = indexeddb.open(name, version);  // name:数据库名,version:数据库版本号

indexedDB はさまざまなブラウザーで互換性があるため、indexedDB と互換性を持たせるにはいくつかの互換性関数が必要です。

2. データベースに接続するためのコールバック関数

request.addEventListener('success', function(event){ 
    // 打开或创建数据库成功
}, false);
request.addEventListener('error', function(event){ 
    // 打开或创建数据库失败
}, false);
request.addEventListener('upgradeneeded', function(event){ 
    // 更新数据库时执行
}, false);

データベースに接続した後、リクエストは 3 つの状態を監視します:

    success: データベースを正常に開くか作成します
  • error: open またはデータベースの作成に失敗しました
  • upgradeneeded: データベースの更新
  • upgradeneeded ステータスは、indexedDB が新しいデータベースを作成するときと、indexeddb.open(name, version) version (データベースのバージョン番号) が変更されたときにのみ監視できます。バージョン番号が変更されない場合、この状態はトリガーされません。データベースの ObjectStore の作成と削除はすべて、このリスニング イベントの下で実行されます。

3. ObjectStore の作成と削除

IndexedDB では、ObjectStore はデータベース テーブルに似ています。

request.addEventListener('upgradeneeded', function(event){ 
    // 创建数据库实例
    const db = event.target.result;
    // 关闭数据库
    db.close();
    // 判断是否有ObjectStore
    db.objectStoreNames.contains(objectStoreName);
    // 删除ObjectStore
    db.deleteObjectStore(objectStoreName);
}, false);

次のメソッドを使用して ObjectStore を作成できます

request.addEventListener('upgradeneeded', function(event){ 
    // 创建数据库实例
    const db = event.target.result;
    // 判断是否有ObjectStore
    if(!db.objectStoreNames.contains(objectStoreName)){
        const store = db.createObjectStore(objectStoreName, {
            keyPath: keyPath  // keyPath 作为ObjectStore的搜索关键字
        });
        // 为ObjectStore创造索引
        store.createIndex(name,    // 索引
                          index,   // 键值
                          {
                              unique: unique  // 索引是否唯一
                          });
    }
}, false);

4. データを追加、削除、変更、確認します

request.addEventListener('success', function(event){ 
    // 创建数据库实例
    const db = event.target.result;
    // 查找一个ObjectStore
    db.transaction(objectStoreName, wa);
    // wa为'readwrite'时,数据可以读写 
    // wa为'readonly'时,数据只读
    const store = transaction.objectStore(objectStoreName);
}, false);

データベースを追加、削除、変更、確認します:

// 添加数据,当关键字存在时数据不会添加
store.add(obj);
// 更新数据,当关键字存在时覆盖数据,不存在时会添加数据
store.put(obj);
// 删除数据,删除指定的关键字对应的数据
store.delete(value);
// 清除ObjectStore
store.clear();
// 查找数据,根据关键字查找指定的数据
const g = store.get(value);
g.addEventListener('success', function(event){
    // 异步查找后的回调函数
}, false);

インデックスでデータを検索

const index = store.index(indexName);
const cursor = index.openCursor(range);
cursor.addEventListener('success', function(event){
    const result = event.target.result;
    if(result){
        result.value       // 数据
        result.continue(); // 迭代,游标下移
    }
}, false);

インデックス範囲に従ってデータを検索

const index = store.index(indexName);
const cursor = index.openCursor(range);
/**
 * range为null时,查找所有数据
 * range为指定值时,查找索引满足该条件的对应的数据
 * range为IDBKeyRange对象时,根据条件查找满足条件的指定范围的数据
 */
// 大于或大于等于 
range = IDBKeyRange.lowerBound(value, true)   // (value, +∞),>  value
range = IDBKeyRange.lowerBound(value, false)  // [value, +∞),>= value
// 小于或小于等于,isOpen:true,开区间;false,闭区间
range = IDBKeyRange.upperBound(value, isOpen)
// 大于或大于等于value1,小于或小于等于value2
IDBKeyRange.bound(value1, value2, isOpen1, isOpen2)

最後に、indexedDBライブラリをカプセル化しました。これを参照できます: duan602728596/IndexedDB

以上がHTML5 IndexedDB ローカル ストレージの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。