菜单

manbetx2.0手机版indexedDB 基本使用

2019年4月10日 - Html/Html5

indexedDB 基本采取

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

原稿出处:
党黎明   


indexedDB简介:

indexedDB
是1种接纳浏览器存款和储蓄大批量多少的方法.它成立的多少年足球以被询问,并且能够离线使用.

 

indexedDB 有以下特征:

  1. indexedDBWebSQL 数据库的取代品
  2. indexedDB服从同源协议(只可以访问同域中蕴藏的数据,而不能够访问别的域的)
  3. API包含异步API同步API三种:多数情景下行使异步API;
    同步API必须同
    WebWorkers
    1起使用, 如今从未浏览器援救同步API
  4. indexedDB 是工作模式的数据库, 使用 key-value 键值对储存数据
  5. indexedDB 不应用结构化查询语言(SQL).
    它经过索引(index)所发出的指针(cursor)来成功查询操作

昨天Android上的图片加载框架很成熟了,相比著名的就要属 Glide , Picasso
与 Volley
了。他们都是正值Github上开源的。因为第二遍选取的图片框架正是Glide,所以对其有说不清道不明的心绪,哈哈(其实就是无意去钻探其余的框架啦,终究Glide还是很强劲的),所以,决定对Glide的学习记录一下。

1、使用indexedDB的基本方式

  1. 打开数据库并且开首3个事务。
  2. 创办1个 objecStore
  3. 塑造3个呼吁来推行壹些数据库操作,像扩充或提取数额等。
  4. 通过监听正确类型的 DOM 事件以伺机操作落成。
  5. 在操作结果上海展览中心开1些操作(能够在 request 对象中找到)

正文是针对性郭霖大神的原创小说–斟酌Glide,学习之后的笔记。

因为源码对本人的话看起来照旧相比较艰辛的,所以就只可以站在巨人的双肩上来学习。那样能为和谐省点力,也能较快的敞亮Glide中关系源码的学识。

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

贰、创制、打开数据库

indexedDB 存在于全局对象window上, 它最要紧的贰个方法正是open主意,
该方法接收八个参数:

var DB_NAME = ‘indexedDB-test’, VERSION = 1, db; var request =
indexedDB.open(DB_NAME, VE大切诺基SION); 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的数据库,则上述代码会创建3个名叫DB_NAME、版本号为VERSION的数据库;
触发的轩然大波依次为: upgradeneededsuccess.

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

Glide是1款由Bump
Technilogies开发的图片加载框架,它的行使方法最佳便捷,大概令人切齿。当然,大家要动用它,首先要丰富正视:

三、创设对象存储空间和目录

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

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 });
};

manbetx2.0手机版 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′

四、增删数据

对数据库的操作(增加和删除查改等)都亟需经过事务来完成,事务具备两种形式:

到当前岗位,它的稳定版本现已到了 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(‘事务回滚!’);
};

manbetx2.0手机版 2数据库对象的transaction()艺术接收三个参数:

如此那般,我们获取2个事情对象transaction, 有二种事件也许会被触发:
complete, error, abort.
现在,我们因而作业向数据库indexedDB-test
对象存款和储蓄空间movies中插入数据:

var objectStore = transaction.objectStore(‘movies’); // 钦命对象存款和储蓄空间
var data = [{ “title”: “寻梦环游记”, “year”: “20一7”, “alt”:
https://movie.douban.com/subject/20495023/“, “id”: “20495023” }, {
“title”: “你在哪”, “year”: “2016”, “alt”:
https://movie.douban.com/subject/26639033/“, “id”: “26639033” }, {
“title”: “笔仙咒怨”, “year”: “20一七”, “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) }; });

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)
    };
});

manbetx2.0手机版 3

因而作业对象transaction,在objectStore()艺术中内定对象存款和储蓄空间,就赢得了足以对该指标存款和储蓄空间拓展操作的对象objectStore.

向数据库中加进数据,add()格局增添的靶子,倘若数据库中已存在同样的主键,或许唯壹性索引的键值重复,则该条数据不会插入进去;

追加多少还有3个格局: put(),
使用办法和add()分化之处在于,数据库中若存在1样主键或然唯一性索引重复,则会更新该条数据,不然插入新数据。

接下来,见证神跡的每二1013日到了:

从数据库中去除数据

删去数据应用delete方法,同上好像:

var request = db.transaction([‘movies’], ‘readwrite’)
.objectStore(‘movies’) .delete(‘2705461二’); // 通过键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(‘99996捌二’); // 通过键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的应用格局,不难吗!别小看那1行代码,其幕后已经为大家做了成都百货上千的事了。当然,那个大家以后再说。大家先来探望这一行代码。

5、使用索引

在前方,大家创造了五个目录alttitle,
配置对象里面包车型客车unique性子标志该值是或不是唯一

当今大家想找到alt属性值为https://movie.douban.com/subject/26639033/的对象,就可以行使索引。

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); };

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);
};

manbetx2.0手机版 4

行使唯1性索引,大家得以获取唯1的一条数据(可能undefined),那么使用非唯一性索引呢?
大家向数据库中插入一条数据,使title重复:

db.transaction(‘movies’, ‘readwrite’).objectStore(‘movies’) .add({ alt:
https://movie.douban.com/subject/27054612121/‘, title: ‘寻梦环游记’,
year: ’20①柒’, id: ‘12345678九’ }) .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);
};

manbetx2.0手机版 5

笔者们获取的是键值小小的的可怜对象.

动用三遍索引,大家只能获取一条数据;
假使我们要求得到全体title属性值为寻梦环游记的靶子,大家能够行使游标.

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

陆、使用游标

取得1个得以操作游标的伸手对象有七个章程:

游标的接纳有以下几处:

在那之中饱含多少个主意:

在指标存款和储蓄空间上选择游标

选用游标常见的壹种形式是取得对象存款和储蓄空间上的保有数据.

var list = []; var objectStore =
db.transaction(‘movies’).objectStore(‘movies’);
objectStore.openCursor().onsuccess = function(event) { var cursor =
event.target.result; if (cursor) { console.log(‘cursor:’, cursor);
list.push(cursor.value); cursor.continue(); } else { console.log(‘Get
all data:’, list); } };

1
2
3
4
5
6
7
8
9
10
11
12
var list = [];
var objectStore = db.transaction(‘movies’).objectStore(‘movies’);
objectStore.openCursor().onsuccess = function(event) {
    var cursor = event.target.result;
    if (cursor) {
        console.log(‘cursor:’, cursor);
        list.push(cursor.value);
        cursor.continue();
    } else {
        console.log(‘Get all data:’, list);
    }
};

manbetx2.0手机版 6

选拔游标时,须要在功成名就回调里获得result目的,判断是或不是取完了数量:若数据已取完,resultundefined;
若未取完,则result是个IDBCursorWithValue对象,需调用continue()方法继续取多少。
也得以遵照自身须要, 对数码举行过滤。

indexedDB2行业内部中,在对象存款和储蓄空间对象上纳入了三个getAll()措施,能够收获具有目的:

objectStore.getAll().onsuccess = function(event) {
console.log(‘result:’, event.target.result); };

1
2
3
objectStore.getAll().onsuccess = function(event) {
    console.log(‘result:’, event.target.result);
};

首先个措施:with(
 )
。参数里收受的是1个加载图片的实例,能够是Context,Activity大概Fragment类型的参数。传入的参数影响图片加载的生命周期。也便是当传入参数的实例被灭绝了,图片的加载也就被甘休了。

在目录上使用游标

随即本文上述使用索引的事例,在目录title上使用openCursor()方法时,若不传参数,则会遍历全数数据,在中标回调中的到的result目的有以下属性:

var index = db .transaction('movies')
.objectStore('movies').index('title'); index.openCursor().onsuccess
= function(event) { var cursor = event.target.result; if (cursor) {
console.log('cursor:', cursor); cursor.continue(); } };

<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<tbody>
<tr class="odd">
<td><div class="crayon-nums-content" style="font-size: 13px !important; line-height: 15px !important;">
<div class="crayon-num" data-line="crayon-5b8f37afae763506229096-1">
1
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f37afae763506229096-2">
2
</div>
<div class="crayon-num" data-line="crayon-5b8f37afae763506229096-3">
3
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f37afae763506229096-4">
4
</div>
<div class="crayon-num" data-line="crayon-5b8f37afae763506229096-5">
5
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f37afae763506229096-6">
6
</div>
<div class="crayon-num" data-line="crayon-5b8f37afae763506229096-7">
7
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f37afae763506229096-8">
8
</div>
<div class="crayon-num" data-line="crayon-5b8f37afae763506229096-9">
9
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f37afae763506229096-10">
10
</div>
</div></td>
<td><div class="crayon-pre" style="font-size: 13px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;">
<div id="crayon-5b8f37afae763506229096-1" class="crayon-line">
var index = db
</div>
<div id="crayon-5b8f37afae763506229096-2" class="crayon-line crayon-striped-line">
.transaction('movies')
</div>
<div id="crayon-5b8f37afae763506229096-3" class="crayon-line">
.objectStore('movies').index('title');
</div>
<div id="crayon-5b8f37afae763506229096-4" class="crayon-line crayon-striped-line">
index.openCursor().onsuccess = function(event) {
</div>
<div id="crayon-5b8f37afae763506229096-5" class="crayon-line">
  var cursor = event.target.result;
</div>
<div id="crayon-5b8f37afae763506229096-6" class="crayon-line crayon-striped-line">
  if (cursor) {
</div>
<div id="crayon-5b8f37afae763506229096-7" class="crayon-line">
      console.log('cursor:', cursor);
</div>
<div id="crayon-5b8f37afae763506229096-8" class="crayon-line crayon-striped-line">
      cursor.continue();
</div>
<div id="crayon-5b8f37afae763506229096-9" class="crayon-line">
  }
</div>
<div id="crayon-5b8f37afae763506229096-10" class="crayon-line crayon-striped-line">
};
</div>
</div></td>
</tr>
</tbody>
</table>


[![](http://jbcdn2.b0.upaiyun.com/2017/12/5451a2dedd05d9226415141022934c72.png)](http://jbcdn2.b0.upaiyun.com/2017/12/5451a2dedd05d9226415141022934c72.png)

在索引title上使用openKeyCursor()方法,若不传参数,同样也会遍历全数数据,result对象属性如下:

openCursor()格局相比,获得的数目少二个value性能,是不曾章程获得存款和储蓄对象的别的部分

前方聊起,咱们要基于目录title获得具有title属性值为寻梦环游记的靶子,要采取游标,而又不想遍历全数数据,那时就要动用openCursor()的第二个参数:
keyRange

keyRange是限制游标遍历的多少范围,通过IDBKeyRange的局地办法设置该值:

var singleKeyRange = IDBKeyRange.only(“寻梦环游记”), list = []; var
index = db .transaction(‘movies’) .objectStore(‘movies’).index(‘title’);
index.openCursor(singleKeyRange).onsuccess = function(event) { var
cursor = event.target.result; if (cursor) { console.log(‘cursor.value:’,
cursor.value); list.push(cursor.value); cursor.continue(); } else {
console.log(‘list:’, list); } };

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var singleKeyRange = IDBKeyRange.only("寻梦环游记"), list = [];
var index = db
.transaction(‘movies’)
.objectStore(‘movies’).index(‘title’);
index.openCursor(singleKeyRange).onsuccess = function(event) {
var cursor = event.target.result;
if (cursor) {
console.log(‘cursor.value:’, cursor.value);
list.push(cursor.value);
cursor.continue();
} else {
    console.log(‘list:’, list);
}
};

manbetx2.0手机版 7

IDBKeyRange别的部分方法:

// 匹配所有在 “Bill” 前面包车型地铁, 包含 “Bill” var lowerBoundKeyRange =
IDBKeyRange.lowerBound(“Bill”); // 相称全部在 “Bill” 后面包车型客车,
可是不供给包蕴 “Bill” var lowerBoundOpenKeyRange =
IDBKeyRange.lowerBound(“Bill”, true); // 相配全部在’堂娜’前边的,
可是不包罗”堂娜” var upperBoundOpenKeyRange =
IDBKeyRange.upperBound(“堂娜”, true); // 相称全体在”比尔” 和 “堂娜”
之间的, 不过不包蕴 “堂娜” var boundKeyRange = IDBKeyRange.bound(“Bill”,
“堂娜”, false, true);

1
2
3
4
5
6
7
8
9
10
11
// 匹配所有在 "Bill" 前面的, 包括 "Bill"
var lowerBoundKeyRange = IDBKeyRange.lowerBound("Bill");
 
// 匹配所有在 “Bill” 前面的, 但是不需要包括 "Bill"
var lowerBoundOpenKeyRange = IDBKeyRange.lowerBound("Bill", true);
 
// 匹配所有在’Donna’后面的, 但是不包括"Donna"
var upperBoundOpenKeyRange = IDBKeyRange.upperBound("Donna", true);
 
// 匹配所有在"Bill" 和 "Donna" 之间的, 但是不包括 "Donna"
var boundKeyRange = IDBKeyRange.bound("Bill", "Donna", false, true);

更加多请参考
MDN|IDBKeyRange

游标私下认可遍历方向是按主键从小到大,有时候大家倒序遍历,此时得以给openCursor()办法传递第二个参数:
direction: next|nextunique|prev|prevunique

var singleKeyRange = IDBKeyRange.only(“寻梦环游记”), list = []; var
index = db .transaction(‘movies’) .objectStore(‘movies’).index(‘title’);
index.openCursor(singleKeyRange, ‘prev’).onsuccess = function(event) {
var cursor = event.target.result; if (cursor) {
console.log(‘cursor.value:’, cursor.value); list.push(cursor.value);
cursor.continue(); } else { console.log(‘list:’, list); } };

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var singleKeyRange = IDBKeyRange.only("寻梦环游记"), list = [];
var index = db
.transaction(‘movies’)
.objectStore(‘movies’).index(‘title’);
index.openCursor(singleKeyRange, ‘prev’).onsuccess = function(event) {
var cursor = event.target.result;
if (cursor) {
console.log(‘cursor.value:’, cursor.value);
list.push(cursor.value);
cursor.continue();
} else {
    console.log(‘list:’, list);
}
};

传了prev的结果是按倒序遍历的.

因为 “name” 索引不是唯一的,那就有望存在具有同样 name 的多条记下。
要注意的是这种气象不容许暴发在目的存款和储蓄空间上,因为键必须永远是唯一的。
若是你想要在游标在目录迭代进度中过滤出双重的,你能够传递
nextunique(或prevunique, 要是你正在向后搜索)作为方向参数。 当
nextunique 或是 prevunique
被应用时,被再次回到的可怜总是键最小的记录。

var singleKeyRange = IDBKeyRange.only(“寻梦环游记”), list = []; var
index = db .transaction(‘movies’) .objectStore(‘movies’).index(‘title’);
index.openCursor(singleKeyRange, ‘prevunique’).onsuccess =
function(event) { var cursor = event.target.result; if (cursor) {
console.log(‘cursor.value:’, cursor.value); list.push(cursor.value);
cursor.continue(); } else { console.log(‘list:’, list); } };

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var singleKeyRange = IDBKeyRange.only("寻梦环游记"), list = [];
var index = db
.transaction(‘movies’)
.objectStore(‘movies’).index(‘title’);
index.openCursor(singleKeyRange, ‘prevunique’).onsuccess = function(event) {
var cursor = event.target.result;
if (cursor) {
console.log(‘cursor.value:’, cursor.value);
list.push(cursor.value);
cursor.continue();
} else {
    console.log(‘list:’, list);
}
};

manbetx2.0手机版 8

其次个艺术:load()。那个办法用于钦赐图片的财富。Glide匡助加载各个各类的图形能源,蕴含互连网图片,本地图片,应用财富,2进制流,uri对象等。

7、关闭和删除数据库

db.close();

<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<tbody>
<tr class="odd">
<td><div class="crayon-nums-content" style="font-size: 13px !important; line-height: 15px !important;">
<div class="crayon-num" data-line="crayon-5b8f37afae779476637224-1">
1
</div>
</div></td>
<td><div class="crayon-pre" style="font-size: 13px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;">
<div id="crayon-5b8f37afae779476637224-1" class="crayon-line">
db.close();
</div>
</div></td>
</tr>
</tbody>
</table>


关闭数据库后,`db`对象仍然保存着该数据库的相关信息,只是无法再开启事务(调用开启事务方法会报错,提示数据库连接已断开):

manbetx2.0手机版 9

JavaScript

window.indexedDB.deleteDatabase(dbName);

<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<tbody>
<tr class="odd">
<td><div class="crayon-nums-content" style="font-size: 13px !important; line-height: 15px !important;">
<div class="crayon-num" data-line="crayon-5b8f37afae77e452573671-1">
1
</div>
</div></td>
<td><div class="crayon-pre" style="font-size: 13px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;">
<div id="crayon-5b8f37afae77e452573671-1" class="crayon-line">
window.indexedDB.deleteDatabase(dbName);
</div>
</div></td>
</tr>
</tbody>
</table>

其多个措施:into()。那么些办法用于内定图片加载到哪些图片控件上。

八、indexedDB的局限性

以下情形不吻合利用IndexedDB

小心,在偏下情状下,数据库可能被消除:

那正是Glide最基本的接纳方法。看到那,你就能很好的加载图片财富到ImageView上了。

总结

  1. 使用indexedDB.open(dbName, version)开辟三个数据库连接
  2. 使用indexedDB.deleteDatabase(dbName)剔除八个数据库
  3. 在数据库对象db上使用createObjectStore(storeName, config)创设对象存款和储蓄空间
  4. 在指标存款和储蓄空间objectStore上使用createIndex(indexName, keyName, config)成立索引
  5. 对数据库的操作都亟需经过事务完成:
    var transction = db.transaction([storeName], mode)
  6. 数据库的增加和删除改查均经过objectStore对象完结,var objectStore = transaction.objectStore(storeName)
  7. 对数据库数据操作有: add()get()delete()put等方法
  8. 查找数据可以使用索引: objectStore.index(indexName)
  9. 遍历和过滤数据可以利用游标: openCursor(keyRange, direction)

参照链接

manbetx2.0手机版 10

接下去正是局部Glide的扩展内容了。

占位图

占位图便是在Glide加载图片的时候,由于加载须求部分时日,大家可以先让ImageView上显得一张图纸,增强用户体验。

Glide. with( this ). load( uril ). placeholder( R.drawble.loading ).
into( imageView );

placeholder( R.drawble.loading ) 这便是为 imageView
添加一个占位图了。

而外那种健康的占位图,还有越发占位图,添加代码:
error(R.drawble.error),Glide加载的时候出现至极的情事(如:手提式无线电电话机互联网特别,图片不存在等)下显得的一张图纸,也是为了完美用户体验。

钦命图片格式

在大家加载一张图片时,Glide能够帮大家看清图片的格式(Glide暗中认可是永葆gif动态图的)。

asBitmap( )  →
表达只好加载静态图片,假如传入的是一张动态图,则只显示图片的率先帧。

asGif(  )
→表达只好加载动态图,借使传入的是一高满堂态图,则会加载退步。

钦赐图片大小

在事实上的采纳Glide中,由于Glide的智能性,我们当先十三分之5动静下是永不钦定图片的大小的,Glide会自动判断ImageView的轻重缓急,然后只将如此大小的图纸加载到内部存款和储蓄器中,帮我们缩小内部存款和储蓄器使用,防止造成内部存款和储蓄器溢出。可是,大家照旧得以内定Glide加载图片的深浅的:

override(200,200);那样,Glide只会加载200*200像素的图样了。


到那边,就主旨理解Glide的基本使用了。哈哈,感觉还不易啊,用起来Glide如故深感很正确的,至少笔者觉得依旧很神奇,这么简单的1行代码就能缓解这样多的事。学习的路还十分短啊,继续加油!!!

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图