ホームページ ウェブフロントエンド H5 チュートリアル HTML5 の IndexedDB データベースの関連紹介

HTML5 の IndexedDB データベースの関連紹介

May 13, 2017 pm 01:15 PM

この記事では主にHTML5におけるindexedDBデータベースの使用例を紹介していますが、編集者がとても良いと思ったので、参考として共有させていただきます。エディターをフォローして見てみましょう

はじめに

HTML5 のローカル ストレージには、indexedDB と呼ばれるデータベースがあり、クライアント上にローカルに保存される大量のデータを保存できます。前回の記事: HTML5 上級シリーズ: Web ストレージから、Web ストレージがローカルの単純なデータに便利かつ柔軟にアクセスできることがわかりましたが、大量の構造化ストレージの場合、indexedDB の利点はさらに明白です。次に、indexedDB がデータを保存する方法を見てみましょう。

データベースに接続

Web サイトには複数の IndexedDB データベースを含めることができますが、各データベースの名前は一意です。データベース名を使用して特定のデータベースに接続する必要があります。

var request = indexedDB.open('dbName', 1);  // 打开 dbName 数据库
request.onerror = function(e){              // 监听连接数据库失败时执行
    console.log('连接数据库失败');
}
request.onsuccess = function(e){            // 监听连接数据库成功时执行
    console.log('连接数据库成功');
}
ログイン後にコピー

indexedDB.open メソッドを使用してデータベースに接続します。このメソッドは 2 つのパラメーターを受け取ります。1 つ目はデータベース名、2 つ目はデータベースのバージョン番号です。このメソッドは、データベースに接続するためのリクエスト オブジェクトを表す IDBOpenDBRequest オブジェクトを返します。リクエスト オブジェクトの onsuccess イベントと onerror イベントをリッスンすることで、接続が成功または失敗した場合に実行されるメソッドを定義できます。

indexedDB API では、データベース内のデータ ウェアハウスを同じバージョンで変更することができないため、indexedDB.open メソッドで新しいバージョン番号を渡してバージョンを更新し、データベース内の変更が繰り返し行われないようにする必要があります。同じバージョン。バージョン番号は整数である必要があります。

var request = indexedDB.open('dbName', 2);  // 更新版本,打开版本为2的数据库
// ...
request.onupgradeneeded = function(e){
    console.log('新数据库版本号为=' + e.newVersion);
}
ログイン後にコピー

リクエストオブジェクトのonupgradeneededイベントをリッスンすることで、データベースのバージョンが更新されたときに実行されるメソッドを定義します。

データベースを閉じる

indexedDB.open を使用してデータベースに正常に接続すると、IDBOpenDBRequest オブジェクトが返され、オブジェクトの close メソッドを呼び出してデータベースを閉じることができます。

var request = indexedDB.open('dbName', 2);
// ...
request.onsuccess = function(e){
    console.log('连接数据库成功');
    var db = e.target.result;
    db.close();
    console.log('数据库已关闭');
}
ログイン後にコピー

Deletedatabase

indexedDB.deleteDatabase('dbName');
console.log('数据库已删除');
ログイン後にコピー

オブジェクトウェアハウスの作成

オブジェクトストア(オブジェクトウェアハウス)はindexedDBデータベースの基礎であり、indexedDBにはデータベーステーブルは存在せず、オブジェクトウェアハウスはデータベースに相当します。テーブル。

var request = indexedDB.open('dbName', 3);
// ...
request.onupgradeneeded = function(e){
    var db = e.target.result;
    var store = db.createObjectStore('Users', {keyPath: 'userId', autoIncrement: false});
    console.log('创建对象仓库成功');
}
ログイン後にコピー

db.createObjectStore メソッドは 2 つのパラメーターを受け取ります。最初のパラメーターはオブジェクト ウェアハウス名、2 番目のパラメーターはオプションのパラメーター、値は js オブジェクトです。このオブジェクトの keyPath attribute は主キーであり、データベース テーブルの主キーである id に相当します。 autoIncrement 属性が false の場合、主キーの値は自動的に増加せず、データを追加するときに主キーの値を指定する必要があることを意味します。

注: データベースでは、オブジェクト ウェアハウス名を繰り返すことはできません。繰り返さないと、ブラウザーによってエラーが報告されます。

Createindex

indexedDB データベース内で取得する場合、インデックスは、インデックスとして設定された属性を介してのみデータベース内に作成されます。

var request = indexedDB.open('dbName', 4);
// ...
request.onupgradeneeded = function(e){
    var db = e.target.result;
    var store = db.createObjectStore('newUsers', {keyPath: 'userId', autoIncrement: false});
    var idx = store.createIndex('usernameIndex','userName',{unique: false})
    console.log('创建索引成功');
}
ログイン後にコピー

store.createIndex メソッドは 3 つのパラメーターを受け取ります。1 つ目はインデックス名で、2 つ目はデータ オブジェクトの属性です。上記の例では、userName 属性がインデックスの作成に使用されます。値が 1 のオプションのパラメーター。このオブジェクトの unique 属性は true です。これは、インデックス値が同じであってはいけない、つまり 2 つのデータの userName が同じであってはいけないことを意味し、false の場合は同じであってもよいことを意味します。

トランザクションに基づく

IndexedDB では、すべてのデータ操作はトランザクション内でのみ実行できます。データベースに正常に接続したら、IDBOpenDBRequest オブジェクトの transaction メソッドを使用して、読み取り専用トランザクションまたは読み取り/書き込みトランザクションを開始できます。


var request = indexedDB.open('dbName', 5);
// ...
request.onupgradeneeded = function(e){
    var db = e.target.result;
    var tx = db.transaction('Users','readonly');
    tx.oncomplete = function(e){
        console.log('事务结束了');
    }
    tx.onabort = function(e){
        console.log('事务被中止了');
    }
}
ログイン後にコピー

db.transaction メソッドは 2 つのパラメーターを受け取ります。最初のパラメーターは、文字列の場合はオブジェクト ウェアハウス名、配列の場合は array です。オブジェクト ウェアハウス名で構成され、トランザクションはパラメータ内の任意のオブジェクト ウェアハウスで動作できます。 2 番目のパラメーターは Transaction Mode です。 readonly が渡されると、オブジェクト ウェアハウスでは読み取り操作のみが実行でき、書き込み操作は実行できません。 Readwrite は、読み取りおよび書き込み操作に渡すことができます。

操作データ

    add(): データを追加します。オブジェクト ウェアハウスに保存する必要があるオブジェクトであるパラメーターを受け取ります。
  1. put() : データを追加または変更します。オブジェクト ウェアハウスに保存する必要があるオブジェクトであるパラメーターを受け取ります。
  2. get() : データを取得します。取得するデータの主キー値であるパラメータを受け取ります。
  3. delete() : データを削除します。取得するデータの主キー値であるパラメータを受け取ります。
var request = indexedDB.open('dbName', 5);
// ...
request.onsuccess = function(e){
    var db = e.target.result;
    var tx = db.transaction('Users','readwrite');
    var store = tx.objectStore('Users');
    var value = {
        'userId': 1,
        'userName': 'linxin',
        'age': 24
    }
    var req1 = store.put(value);        // 保存数据
    var req2 = store.get(1);            // 获取索引userId为1的数据
    req2.onsuccess = function(){
        console.log(this.result.userName);  // linxin
    }
    var req3 = store.delete(1);             // 删除索引为1的数据
    req3.onsuccess = function(){
        console.log('删除数据成功');        // 删除数据成功
    }
}
ログイン後にコピー

add 和 put 的作用类似,区别在于 put 保存数据时,如果该数据的主键在数据库中已经有相同主键的时候,则会修改数据库中对应主键的对象,而使用 add 保存数据,如果该主键已经存在,则保存失败。

检索数据

上面我们知道使用 get() 方法可以获取数据,但是需要制定主键值。如果我们想要获取一个区间的数据,可以使用游标。游标通过对象仓库的 openCursor 方法创建并打开。

openCursor 方法接收两个参数,第一个是 IDBKeyRange 对象,该对象创建方法主要有以下几种:

// boundRange 表示主键值从1到10(包含1和10)的集合。
// 如果第三个参数为true,则表示不包含最小键值1,如果第四参数为true,则表示不包含最大键值10,默认都为false
var boundRange = IDBKeyRange.bound(1, 10, false, false);

// onlyRange 表示由一个主键值的集合。only() 参数则为主键值,整数类型。
var onlyRange = IDBKeyRange.only(1);

// lowerRaneg 表示大于等于1的主键值的集合。
// 第二个参数可选,为true则表示不包含最小主键1,false则包含,默认为false
var lowerRange = IDBKeyRange.lowerBound(1, false);

// upperRange 表示小于等于10的主键值的集合。
// 第二个参数可选,为true则表示不包含最大主键10,false则包含,默认为false
var upperRange = IDBKeyRange.upperBound(10, false);
ログイン後にコピー

openCursor 方法的第二个参数表示游标的读取方向,主要有以下几种:

  1. next : 游标中的数据按主键值升序排列,主键值相等的数据都被读取

  2. nextunique : 游标中的数据按主键值升序排列,主键值相等只读取第一条数据

  3. prev : 游标中的数据按主键值降序排列,主键值相等的数据都被读取

  4. prevunique : 游标中的数据按主键值降序排列,主键值相等只读取第一条数据

var request = indexedDB.open('dbName', 6);
// ...
request.onsuccess = function(e){
    var db = e.target.result;
    var tx = db.transaction('Users','readwrite');
    var store = tx.objectStore('Users');
    var range = IDBKeyRange.bound(1,10);
    var req = store.openCursor(range, 'next');
    req.onsuccess = function(){
        var cursor = this.result;
        if(cursor){
            console.log(cursor.value.userName);
            cursor.continue();
        }else{
            console.log('检索结束');
        }
    }
}
ログイン後にコピー

当存在符合检索条件的数据时,可以通过 update 方法更新该数据:

cursor.updata({
    userId : cursor.key,
    userName : 'Hello',
    age : 18
});
ログイン後にコピー

可以通过 delete 方法删除该数据:

cursor.delete();
ログイン後にコピー

可以通过 continue 方法继续读取下一条数据,否则读到第一条数据之后不再继续读取:

cursor.continue();
ログイン後にコピー

总结

从连接数据库,创建对象仓库、索引,到操作、检索数据,完成了 indexedDB 存取数据的完整流程。下面通过一个完整的例子来更好地掌握 indexedDB 数据库。代码地址:indexedDB-demo

【相关推荐】

1. 特别推荐“php程序员工具箱”V0.1版本下载

2. 免费h5在线视频教程

3. php.cn原创html5视频教程

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

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

HTMLの表の境界線 HTMLの表の境界線 Sep 04, 2024 pm 04:49 PM

HTML の表の境界線に関するガイド。ここでは、HTML でのテーブルの境界線の例を示しながら、テーブル境界線を定義する複数の方法について説明します。

HTML 左マージン HTML 左マージン Sep 04, 2024 pm 04:48 PM

HTML マージン左のガイド。ここでは、HTML margin-left の概要とその例、およびそのコード実装について説明します。

HTML のネストされたテーブル HTML のネストされたテーブル Sep 04, 2024 pm 04:49 PM

これは、HTML でのネストされたテーブルのガイドです。ここでは、テーブル内にテーブルを作成する方法をそれぞれの例とともに説明します。

HTML テーブルのレイアウト HTML テーブルのレイアウト Sep 04, 2024 pm 04:54 PM

HTML テーブル レイアウトのガイド。ここでは、HTML テーブル レイアウトの値と例および出力について詳しく説明します。

HTML入力プレースホルダー HTML入力プレースホルダー Sep 04, 2024 pm 04:54 PM

HTML 入力プレースホルダーのガイド。ここでは、コードと出力とともに HTML 入力プレースホルダーの例について説明します。

HTML 順序付きリスト HTML 順序付きリスト Sep 04, 2024 pm 04:43 PM

HTML 順序付きリストのガイド。ここでは、HTML 順序付きリストと型の導入とその例についても説明します。

HTML 内のテキストの移動 HTML 内のテキストの移動 Sep 04, 2024 pm 04:45 PM

HTML でのテキストの移動に関するガイド。ここでは、概要、マーキー タグが構文でどのように機能するか、および実装例について説明します。

HTML の onclick ボタン HTML の onclick ボタン Sep 04, 2024 pm 04:49 PM

HTML オンクリック ボタンのガイド。ここでは、それらの紹介、動作、例、およびさまざまなイベントでの onclick イベントについてそれぞれ説明します。

See all articles