xml地图|网站地图|网站标签 [设为首页] [加入收藏]

美高梅游戏网站

当前位置:美高梅游戏网站 > 美高梅游戏网站 > 第一篇:基本使用

第一篇:基本使用

来源:http://www.gd-chuangmei.com 作者:美高梅游戏网站 时间:2019-10-08 11:56

indexedDB 基本使用

2017/12/14 · 基础技术 · 1 评论 · IndexedDB

原文出处: 党黎明   


indexedDB简介:

indexedDB 是一种使用浏览器存储大量数据的方法.它创造的数据可以被查询,并且可以离线使用.

 

indexedDB 有以下特点:

  1. indexedDBWebSQL 数据库的取代品
  2. indexedDB遵循同源协议(只能访问同域中存储的数据,而不能访问其他域的)
  3. API包含异步API同步API两种:多数情况下使用异步API; 同步API必须同 WebWorkers 一起使用, 目前没有浏览器支持同步API
  4. indexedDB 是事务模式的数据库, 使用 key-value 键值对储存数据
  5. indexedDB 不使用结构化查询语言(SQL). 它通过索引(index)所产生的指针(cursor)来完成查询操作

现在Android上的图片加载框架很成熟了,比较出名的就要属 Glide , Picasso 与 Volley 了。他们都是正在Github上开源的。因为第一次使用的图片框架就是Glide,所以对其有说不清道不明的情怀,哈哈(其实就是懒得去研究其它的框架啦,毕竟Glide还是很强大的),所以,决定对Glide的学习记录一下。

一、使用indexedDB的基本模式

  1. 打开数据库并且开始一个事务。
  2. 创建一个 objecStore
  3. 构建一个请求来执行一些数据库操作,像增加或提取数据等。
  4. 通过监听正确类型的 DOM 事件以等待操作完成。
  5. 在操作结果上进行一些操作(可以在 request 对象中找到)

本文是针对郭霖大神的原创作品--探究Glide,学习之后的笔记。

因为源码对我来说看起来还是比较吃力的,所以就只好站在巨人的肩膀上来学习。这样能为自己省点力,也能较快的理解Glide中涉及源码的知识。

Glide的GitHub地址为:https://github.com/bumptech/glide.

二、创建、打开数据库

indexedDB 存在于全局对象window上, 它最重要的一个方法就是open方法, 该方法接收两个参数:

  • dbName // 数据库名称 [string]
  • version // 数据库版本 [整型number]

var DB_NAME = 'indexedDB-test', VERSION = 1, db; var request = indexedDB.open(DB_NAME, VERSION); request.onsuccess = function(event) { db = event.target.result; // console.log(event.target === request); // true db.onsuccess = function(event) { console.log('数据库操作成功!'); }; db.onerror = function(event) { console.error('数据库操作发生错误!', event.target.errorCode); }; console.log('打开数据库成功!'); }; request.onerror = function(event) { console.error('创建数据库出错'); console.error('error code:', event.target.errorCode); }; request.onupgradeneeded = function(event) { // 更新对象存储空间和索引 .... };

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var DB_NAME = 'indexedDB-test', VERSION = 1, db;
var request = indexedDB.open(DB_NAME, VERSION);
request.onsuccess = function(event) {
    db = event.target.result;
    // console.log(event.target === request); // true
    db.onsuccess = function(event) {
        console.log('数据库操作成功!');
    };
    db.onerror = function(event) {
        console.error('数据库操作发生错误!', event.target.errorCode);
    };
    console.log('打开数据库成功!');
};
request.onerror = function(event) {
    console.error('创建数据库出错');
    console.error('error code:', event.target.errorCode);
};
request.onupgradeneeded = function(event) {
   // 更新对象存储空间和索引 ....
};

若是本域下不存在名为DB_NAME的数据库,则上述代码会创建一个名为DB_NAME、版本号为VERSION的数据库; 触发的事件依次为: upgradeneededsuccess.

若是已存在名为DB_NAME的数据库, 则上述代码会打开该数据库; 只触发success/error事件,不会触发upgradeneeded事件. db是对该数据库的引用.

Glide是一款由Bump Technilogies开发的图片加载框架,它的使用方式极其简便,简直令人发指。当然,我们要使用它,首先要添加依赖:

三、创建对象存储空间和索引

在关系型数据库(如mysql)中,一个数据库中会有多张表,每张表有各自的主键、索引等;

key-value型数据库(如indexedDB)中, 一个数据库会有多个对象存储空间,每个存储空间有自己的主键、索引等;

创建对象存储空间的操作一般放在创建数据库成功回调里:

request.onupgradeneeded = function(event) { // 更新对象存储空间和索引 .... var database = event.target.result; var objectStore = database.createObjectStore("movies", { keyPath: "id" }); objectStore.createIndex('alt', 'alt', { unique: true }); objectStore.createIndex('title', 'title', { unique: false }); };

1
2
3
4
5
6
request.onupgradeneeded = function(event) { // 更新对象存储空间和索引 ....
    var database = event.target.result;
    var objectStore = database.createObjectStore("movies", { keyPath: "id" });
    objectStore.createIndex('alt', 'alt', { unique: true });
    objectStore.createIndex('title', 'title', { unique: false });
};

图片 1

onupgradeneeded 是我们唯一可以修改数据库结构的地方。在这里面,我们可以创建和删除对象存储空间以及构建和删除索引。

在数据库对象database上,有以下方法可供调用:

  1. createObjectStore(storeName, configObj) 创建一个对象存储空间
    • storeName // 对象存储空间的名称 [string]
    • configObj // 该对象存储空间的配置 [object] (其中的keyPath属性值,标志对象的该属性值唯一)
  2. createIndex(indexName, objAttr, configObj) 创建一个索引
    • indexName // 索引名称 [string]
    • objAttr // 对象的属性名 [string]
    • configObj // 该索引的配置对象 [object]

        compile'com.github.bumptech.glide:glide:4.0.0'

四、增加和删除数据

对数据库的操作(增删查改等)都需要通过事务来完成,事务具有三种模式:

  • readonly 只读(可以并发进行,优先使用)
  • readwrite 读写
  • versionchange 版本变更

到目前位置,它的稳定版本已经到了 Glide:4.0.0 了。然后别忘了添加网络权限(这个很容易忘的,本人就吃过不少亏,呜呜~~)。

向数据库中增加数据

前面提到,增加数据需要通过事务事务的使用方式如下:

var transaction = db.transaction(['movies'], 'readwrite'); transaction.oncomplete = function(event) { console.log('事务完成!'); }; transaction.onerror = function(event) { console.log('事务失败!', event.target.errorCode); }; transaction.onabort = function(event) { console.log('事务回滚!'); };

1
2
3
4
5
6
7
8
9
10
var transaction = db.transaction(['movies'], 'readwrite');
transaction.oncomplete = function(event) {
    console.log('事务完成!');
};
transaction.onerror = function(event) {
    console.log('事务失败!', event.target.errorCode);
};
transaction.onabort = function(event) {
    console.log('事务回滚!');
};

图片 2数据库对象的transaction()方法接收两个参数:

  • storeNames // 对象存储空间,可以是对象存储空间名称的数组,也可以是单个对象存储空间名称,必传 [array|string]
  • mode // 事务模式,上面提到的三种之一,可选,默认值是readonly [string]

这样,我们得到一个事务对象transaction, 有三种事件可能会被触发: complete, error, abort. 现在,我们通过事务向数据库indexedDB-test的 对象存储空间movies中插入数据:

var objectStore = transaction.objectStore('movies'); // 指定对象存储空间 var data = [{ "title": "寻梦环游记", "year": "2017", "alt": "", "id": "20495023" }, { "title": "你在哪", "year": "2016", "alt": "", "id": "26639033" }, { "title": "笔仙咒怨", "year": "2017", "alt": "", "id": "27054612" }]; data.forEach(function(item, index){ var request = objectStore.add(item); request.onsuccess = function(event) { console.log('插入成功!', index); console.log(event.target.result, item.id); // add()方法调用成功后result是被添加的值的键(id) }; });

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var objectStore = transaction.objectStore('movies');  // 指定对象存储空间
var data = [{
  "title": "寻梦环游记",
  "year": "2017",
  "alt": "https://movie.douban.com/subject/20495023/",
  "id": "20495023"
}, {
  "title": "你在哪",
  "year": "2016",
  "alt": "https://movie.douban.com/subject/26639033/",
  "id": "26639033"
}, {
  "title": "笔仙咒怨",
  "year": "2017",
  "alt": "https://movie.douban.com/subject/27054612/",
  "id": "27054612"
}];
data.forEach(function(item, index){
    var request = objectStore.add(item);
    request.onsuccess = function(event) {
        console.log('插入成功!', index);
        console.log(event.target.result, item.id); // add()方法调用成功后result是被添加的值的键(id)
    };
});

图片 3

通过事务对象transaction,在objectStore()方法中指定对象存储空间,就得到了可以对该对象存储空间进行操作的对象objectStore.

向数据库中增加数据,add()方法增加的对象,若是数据库中已存在相同的主键,或者唯一性索引的键值重复,则该条数据不会插入进去;

增加数据还有一个方法: put(), 使用方法和add()不同之处在于,数据库中若存在相同主键或者唯一性索引重复,则会更新该条数据,否则插入新数据。

然后,见证奇迹的时刻到了:

从数据库中删除数据

删除数据使用delete方法,同上类似:

var request = db.transaction(['movies'], 'readwrite') .objectStore('movies') .delete('27054612'); // 通过键id来删除 request.onsuccess = function(event) { console.log('删除成功!'); console.log(event.target.result); };

1
2
3
4
5
6
7
8
var request =
    db.transaction(['movies'], 'readwrite')
      .objectStore('movies')
      .delete('27054612');  // 通过键id来删除
request.onsuccess = function(event) {
    console.log('删除成功!');
    console.log(event.target.result);
};

 

        Glide.with( ).load( ).into( );**

从数据中获取数据

获取数据使用get方法,同上类似:

var request = db.transaction('movies') .objectStore('movies') .get('9999682'); // 通过键alt来获取 request.onsuccess = function(event) { console.log('获取成功!', event.target.result); };

1
2
3
4
5
6
7
var request =
    db.transaction('movies')
       .objectStore('movies')
       .get('9999682');  // 通过键alt来获取
request.onsuccess = function(event) {
    console.log('获取成功!', event.target.result);
};

没错,这就是Glide的使用方式,简单吧!别小看这一行代码,其背后已经为我们做了很多的事了。当然,这个我们以后再说。我们先来看看这一行代码。

五、使用索引

在前面,我们创建了两个索引alttitle, 配置对象里面的unique属性标志该值是否唯一

现在我们想找到alt属性值为https://movie.douban.com/subject/26639033/的对象,就可以使用索引。

var alt = ''; var objectStore = db.transaction('movies').objectStore('movies'); // 打开对象存储空间 var index = objectStore.index('alt'); // 使用索引'alt' var request = index.get(alt); // 创建一个查找数据的请求 request.onsuccess = function(event) { console.log('The result is:', event.target.result); }; var noDataTest = index.get('testalt'); // 没有该对象时的测试 noDataTest.onsuccess = function(event) { console.log('success! result:', event.target.result); }; noDataTest.onerror = function(event) { console.log('error! event:', event); };

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var alt = 'https://movie.douban.com/subject/26639033/';
var objectStore = db.transaction('movies').objectStore('movies');  // 打开对象存储空间
var index = objectStore.index('alt');  // 使用索引'alt'
var request = index.get(alt);          // 创建一个查找数据的请求
request.onsuccess = function(event) {
    console.log('The result is:', event.target.result);
};
var noDataTest = index.get('testalt');  // 没有该对象时的测试
noDataTest.onsuccess = function(event) {
    console.log('success! result:', event.target.result);
};
noDataTest.onerror = function(event) {
    console.log('error! event:', event);
};

图片 4

使用唯一性索引,我们可以得到唯一的一条数据(或者undefined),那么使用非唯一性索引呢?
我们向数据库中插入一条数据,使title重复:

db.transaction('movies', 'readwrite').objectStore('movies') .add({ alt: '', title: '寻梦环游记', year: '2017', id: '123456789' }) .onsuccess = function(event) { console.log('插入成功!'); };

1
2
3
4
5
6
7
db.transaction('movies', 'readwrite').objectStore('movies')
.add({ alt: 'https://movie.douban.com/subject/27054612121/',
    title: '寻梦环游记',
    year: '2017',
    id: '123456789'
})
.onsuccess = function(event) { console.log('插入成功!'); };

使用索引title获取title值为寻梦环游记的对象:

var indexName = 'title', title = '寻梦环游记'; var objectStore = db.transaction('movies').objectStore('movies'); var index = objectStore.index(indexName); // 使用索引'alt' var request = index.get(title); // 创建一个查找数据的请求 request.onsuccess = function(event) { console.log('The result is:', event.target.result); };

1
2
3
4
5
6
7
var indexName = 'title', title = '寻梦环游记';
var objectStore = db.transaction('movies').objectStore('movies');
var index = objectStore.index(indexName);  // 使用索引'alt'
var request = index.get(title);          // 创建一个查找数据的请求
request.onsuccess = function(event) {
    console.log('The result is:', event.target.result);
};

图片 5

我们得到的是键值最小的那个对象.

使用一次索引,我们只能得到一条数据; 如果我们需要得到所有title属性值为寻梦环游记的对象,我们可以使用游标.

       Glide.with( ).load( ).into( );  

六、使用游标

得到一个可以操作游标的请求对象有两个方法:

  • openCursor(keyRange, direction)
  • openKeyCursor(keyRange, direction)
    这两个方法接收的参数一样, 两个参数都是可选的: 第一个参数是限制值得范围,第二个参数是指定游标方向

游标的使用有以下几处:

  • 在对象存储空间上使用: var cursor = objectStore.openCursor()
  • 在索引对象上使用: var cursor = index.openCursor()

其中包含三个方法:

本文由美高梅游戏网站发布于美高梅游戏网站,转载请注明出处:第一篇:基本使用

关键词: