찾다
웹 프론트엔드H5 튜토리얼HTML5의 indexedDB 데이터베이스 관련 소개

이번 글은 HTML5에서 indexedDB 데이터베이스의 활용 사례를 주로 소개하고 있는데, 편집자가 꽤 좋다고 생각해서 지금부터 공유하고 참고용으로 올려보겠습니다. 에디터를 따라가서 살펴보자.

머리말

HTML5의 로컬 스토리지에는 indexedDB라는 데이터베이스가 있는데, 클라이언트에 저장되는 데이터베이스이다. . 대용량 데이터를 저장할 수 있는 로컬 NoSQL 데이터베이스입니다. 이전 기사인 HTML5 고급 시리즈: 웹 스토리지에서 우리는 웹 스토리지가 간단한 데이터를 로컬에서 편리하고 유연하게 액세스할 수 있다는 것을 알고 있지만, 대량의 구조화된 스토리지의 경우 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 객체가 반환됩니다. 이 객체의 닫기 메소드를 호출하여 닫을 수 있습니다. 데이터베이스.

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('数据库已删除');

오브젝트 웨어하우스 생성

객체 저장소 있음 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인 경우에는 기본 키 값이 자동으로 증가하지 않는다는 의미이며, 데이터 추가 시 기본 키 값을 지정해야 합니다.

참고: 데이터베이스에서는 개체 창고 이름을 반복할 수 없습니다. 그렇지 않으면 브라우저에서 오류가 보고됩니다.

index

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 객체입니다. 이 객체의 고유 속성은 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 메소드는 두 개의 매개변수를 받습니다. 첫 번째 매개변수는 string 또는 array일 수 있으며, 문자열인 경우 객체 웨어하우스 이름, 배열인 경우 객체 웨어하우스 이름으로 구성된 배열입니다. 트랜잭션은 매개변수에 있는 모든 객체 웨어하우스에서 작동할 수 있습니다. 두 번째 매개변수는 Transaction Mode입니다. 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으로 문의하세요.
html5的div一行可以放两个吗html5的div一行可以放两个吗Apr 25, 2022 pm 05:32 PM

html5的div元素默认一行不可以放两个。div是一个块级元素,一个元素会独占一行,两个div默认无法在同一行显示;但可以通过给div元素添加“display:inline;”样式,将其转为行内元素,就可以实现多个div在同一行显示了。

html5中列表和表格的区别是什么html5中列表和表格的区别是什么Apr 28, 2022 pm 01:58 PM

html5中列表和表格的区别:1、表格主要是用于显示数据的,而列表主要是用于给数据进行布局;2、表格是使用table标签配合tr、td、th等标签进行定义的,列表是利用li标签配合ol、ul等标签进行定义的。

html5怎么让头和尾固定不动html5怎么让头和尾固定不动Apr 25, 2022 pm 02:30 PM

固定方法:1、使用header标签定义文档头部内容,并添加“position:fixed;top:0;”样式让其固定不动;2、使用footer标签定义尾部内容,并添加“position: fixed;bottom: 0;”样式让其固定不动。

html5中不支持的标签有哪些html5中不支持的标签有哪些Mar 17, 2022 pm 05:43 PM

html5中不支持的标签有:1、acronym,用于定义首字母缩写,可用abbr替代;2、basefont,可利用css样式替代;3、applet,可用object替代;4、dir,定义目录列表,可用ul替代;5、big,定义大号文本等等。

HTML5中画布标签是什么HTML5中画布标签是什么May 18, 2022 pm 04:55 PM

HTML5中画布标签是“<canvas>”。canvas标签用于图形的绘制,它只是一个矩形的图形容器,绘制图形必须通过脚本(通常是JavaScript)来完成;开发者可利用多种js方法来在canvas中绘制路径、盒、圆、字符以及添加图像等。

html5废弃了哪个列表标签html5废弃了哪个列表标签Jun 01, 2022 pm 06:32 PM

html5废弃了dir列表标签。dir标签被用来定义目录列表,一般和li标签配合使用,在dir标签对中通过li标签来设置列表项,语法“<dir><li>列表项值</li>...</dir>”。HTML5已经不支持dir,可使用ul标签取代。

Html5怎么取消td边框Html5怎么取消td边框May 18, 2022 pm 06:57 PM

3种取消方法:1、给td元素添加“border:none”无边框样式即可,语法“td{border:none}”。2、给td元素添加“border:0”样式,语法“td{border:0;}”,将td边框的宽度设置为0即可。3、给td元素添加“border:transparent”样式,语法“td{border:transparent;}”,将td边框的颜色设置为透明即可。

html5为什么只需要写doctypehtml5为什么只需要写doctypeJun 07, 2022 pm 05:15 PM

因为html5不基于SGML(标准通用置标语言),不需要对DTD进行引用,但是需要doctype来规范浏览器的行为,也即按照正常的方式来运行,因此html5只需要写doctype即可。“!DOCTYPE”是一种标准通用标记语言的文档类型声明,用于告诉浏览器编写页面所用的标记的版本。

See all articles

핫 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 Hentai를 무료로 생성하십시오.

뜨거운 도구

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기