首頁 web前端 H5教程 HTML5中indexedDB 資料庫的相關介紹

HTML5中indexedDB 資料庫的相關介紹

May 13, 2017 pm 01:15 PM

這篇文章主要介紹了HTML5中indexedDB 資料庫的使用實例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧

前言

在HTML5 的本地儲存中,有一種叫做indexedDB 的資料庫,該資料庫是一種儲存在客戶端本地的NoSQL 資料庫,它可以儲存大量的資料。從上篇:HTML5 進階系列:web Storage ,我們知道 web Storage 可以方便靈活的在本地訪問簡單數據,但是對於大量結構化存儲,indexedDB 的優勢就更加明顯。接下來我們來看看 indexedDB 如何儲存資料。

連接資料庫

一個網站可以有多個 indexedDB 資料庫,但每個資料庫的名稱是唯一的。我們需要透過資料庫名來連接某個特定的資料庫。

var request = indexedDB.open('dbName', 1);  // 打开 dbName 数据库
request.onerror = function(e){              // 监听连接数据库失败时执行
    console.log('连接数据库失败');
}
request.onsuccess = function(e){            // 监听连接数据库成功时执行
    console.log('连接数据库成功');
}
登入後複製

我們使用 indexedDB.open 方法來連接資料庫,該方法接收兩個參數,第一個是資料庫名,第二個是資料庫版本號。此方法會傳回一個 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('数据库已关闭');
}
登入後複製

刪除資料庫

indexedDB.deleteDatabase('dbName');
console.log('数据库已删除');
登入後複製

建立物件倉庫

object store(物件倉庫)是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 方法接收兩個參數,第一個為物件倉庫名,第二個參數為可選參數,值為一個js物件。該物件中的 keyPath 屬性為主鍵,相當於資料庫表中 id 為主鍵。 autoIncrement 屬性為 false,則表示主鍵值不自增,新增資料時需指定主鍵值。

注意:在資料庫中,物件倉庫名稱不可重複,否則瀏覽器會報錯。

建立索引

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 方法接收三個參數,第一個為索引名,第二個為資料物件的屬性,上例使用userName 屬性建立索引,第三個參數為可選參數,值為一個js物件。此物件中的 unique 屬性為 true,代表索引值不可以相同,即兩個資料的 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 方法接收兩個參數,第一個參數可以是字串陣列,字串時則是物件倉庫名,數組時則是由物件倉庫名稱組成的數組,transaction 可以對參數中任何一個物件倉庫進行操作。第二個參數為交易模式,傳入 readonly 時只能對物件倉庫進行讀取操作,無法寫入操作。可以傳入 readwrite 進行讀寫操作。

操作資料

  1. add() : 增加資料。接收一個參數,為需要儲存到物件倉庫中的物件。

  2. put() : 增加或修改資料。接收一個參數,為需要儲存到物件倉庫中的物件。

  3. get() : 取得資料。接收一個參數,為需要取得資料的主鍵值。

  4. 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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

HTML 中的表格邊框 HTML 中的表格邊框 Sep 04, 2024 pm 04:49 PM

HTML 表格邊框指南。在這裡,我們以 HTML 中的表格邊框為例,討論定義表格邊框的多種方法。

HTML 中的巢狀表 HTML 中的巢狀表 Sep 04, 2024 pm 04:49 PM

這是 HTML 中巢狀表的指南。這裡我們討論如何在表中建立表格以及對應的範例。

HTML 左邊距 HTML 左邊距 Sep 04, 2024 pm 04:48 PM

HTML 左邊距指南。在這裡,我們討論 HTML margin-left 的簡要概述及其範例及其程式碼實作。

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 中的文字移動指南。在這裡我們討論一下marquee標籤如何使用語法和實作範例。

HTML onclick 按鈕 HTML onclick 按鈕 Sep 04, 2024 pm 04:49 PM

HTML onclick 按鈕指南。這裡我們分別討論它們的介紹、工作原理、範例以及各個事件中的onclick事件。

See all articles