澳门太阳娱乐集团官网-太阳集团太阳娱乐登录

第一篇:基本选择
分类:网页制作

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的求学记录一下。

一、开荒中可经过less.js动态生成css

1、简介
less是css的一种预管理语言,在less里能够定义变量,轻巧的+-*/运算,代码混合等等,能够压实我们的付出成效。
可参考
http://www.bootcss.com/p/lesscss/
2、使用
下载less.js
http://lesscss.cn/#download-options
页面引进less和less.js

<link rel="stylesheet/less" href="syle.less">
<script src=jquery.min.js"></script>
<script src="less.min.js"></script>

这么会在页面加载后动态生产css,正式意况中建议引进生成好的css文件。
3、语法完全辅助css语法

通过@定义变量,依然采用就近原则,局部变量有使用局部变量。

变量允许我们单独定义一系列通用的样式,然后在需要的时候去调用。所以在做全局样式调整的时候我们可能只需要修改几行代码就可以了。
混合可以将一个定义好的class A轻松的引入到另一个class B中,从而简单实现class B继承class A中的所有属性。我们还可以带参数地调用,就像使用函数一样。

// LESS

@color: #4D926F;

#header {
 color: @color;
}
h2 {
 color: @color;
}

/* 生成的 CSS */

#header {
 color: #4D926F;
}
h2 {
 color: #4D926F;
}

// LESS

.rounded-corners (@radius: 5px) {
 border-radius: @radius;
 -webkit-border-radius: @radius;
 -moz-border-radius: @radius;
}

#header {
 .rounded-corners;
}
#footer {
 .rounded-corners(10px);
}

/* 生成的 CSS */

#header {
 border-radius: 5px;
 -webkit-border-radius: 5px;
 -moz-border-radius: 5px;
}
#footer {
 border-radius: 10px;
 -webkit-border-radius: 10px;
 -moz-border-radius: 10px;
}

我们可以在一个选择器中嵌套另一个选择器来实现继承,这样很大程度减少了代码量,并且代码看起来更加的清晰。

// LESS

#header {
 h1 {
 font-size: 26px;
 font-weight: bold;
 }
 p { font-size: 12px;
 a { text-decoration: none;
 &:hover { border-width: 1px }
 }
 }
}

/* 生成的 CSS */

#header h1 {
 font-size: 26px;
 font-weight: bold;
}
#header p {
 font-size: 12px;
}
#header p a {
 text-decoration: none;
}
#header p a:hover {
 border-width: 1px;
}

运算提供了加,减,乘,除操作;我们可以做属性值和颜色的运算,这样就可以实现属性值之间的复杂关系。LESS中的函数一一映射了JavaScript代码,如果你愿意的话可以操作属性值。

// LESS

@the-border: 1px;
@base-color: #111;
@red: #842210;

#header {
 color: @base-color * 3;
 border-left: @the-border;
 border-right: @the-border * 2;
}
#footer { 
 color: @base-color + #003300;
 border-color: desaturate(@red, 10%);
}

/* 生成的 CSS */

#header {
 color: #333;
 border-left: 1px;
 border-right: 2px;
}
#footer { 
 color: #114411;
 border-color: #7d2717;
}

3、less的监视方式

监视形式是顾客端的二个效能,那一个效果允许你当您转移样式的时候,顾客端将机关刷新。

要运用它,只要在UENVISIONL前面加上'#!watch',然后刷新页面就足以了。其它,你也得以因而在巅峰运维less.watch()来运营监视情势。

这一个是less的为主使用方法,更加的多职能和高档用法,能够查看api文书档案。

一、使用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, 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的数据库,则上述代码会创设二个名称叫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", { key帕特h: "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()

个中蕴藏四个办法:

在目的存款和储蓄空间上选拔游标

利用游标常见的一种格局是获得对象存储空间上的有所数据.

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

图片 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(  )。参数里接受的是二个加载图片的实例,能够是Context,Activity大概Fragment类型的参数。传入的参数影响图片加载的生命周期。也正是当传入参数的实例被销毁了,图片的加载也就被终止了。

在目录上利用游标

继而本文上述使用索引的例证,在目录title上使用openCursor()办法时,若不传参数,则会遍历全体数据,在成功回调中的到的result目的有以下属性:

  • key 数据库中那条对象的title属性值
  • primaryKey 数据库中那条对象的alt
  • value 数据库中那条对象
  • direction openCursor()方法传入的第贰个对象,暗中同意值为next
  • source IDBIndex对象 比如如下:
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对象属性如下:

  • key 数据库中那条对象的title属性值
  • primaryKey 数据库中那条对象的alt
  • direction openCursor()方法传入的第二个指标,暗中认可值为next
  • source altBIndex对象

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

图片 7

IDBKeyRange别的部分主意:

// 相称全体在 "Bill" 前面包车型客车, 包罗 "Bill" var lowerBoundKeyRange = IDBKeyRange.lowerBound("Bill"); // 相配全部在 “Bill” 前边的, 可是没有必要包罗 "比尔" var lowerBoundOpenKeyRange = IDBKeyRange.lowerBound("Bill", true); // 相配全部在'Donna'前面包车型客车, 然则不蕴含"Donna" var upperBoundOpenKeyRange = IDBKeyRange.upperBound("Donna", true); // 匹配全体在"Bill" 和 "Donna" 之间的, 但是不包罗 "堂娜" var boundKeyRange = IDBKeyRange.bound("Bill", "Donna", 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);
}
};

图片 8

其次个法子:load()。那么些主意用于钦定图片的财富。Glide帮忙加载精彩纷呈的图样能源,包括互联网图片,本地图片,应用能源,二进制流,uri对象等。

七、关闭和删除数据库

  • 闭馆数据库只要求在数据库对象db上调用close()办法就能够
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`对象仍然保存着该数据库的相关信息,只是无法再开启事务(调用开启事务方法会报错,提示数据库连接已断开):

图片 9

  • 删去数据库则需求动用indexedDB.deleteDatabase(dbName)方法
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)

参谋链接

  • IndexedDB的基本概念-MDN
  • 使用 IndexedDB-MDN
  • IndexedDB API接口-MDN
  • Indexed Database API 2.0 – w3c

    1 赞 2 收藏 1 评论

图片 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的智能性,我们大多数动静下是绝不钦赐图片的大小的,Glide会自动判别ImageView的轻重缓急,然后只将如此大小的图片加载到内部存款和储蓄器中,帮大家减弱内部存款和储蓄器使用,幸免变成内部存储器溢出。不过,大家仍可以钦定Glide加载图片的尺寸的:

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


到此处,就核心精晓Glide的中坚使用了。哈哈,感到基本上能用啊,用起来Glide照旧深感特别不错的,至少自身感到依然比绝对漂亮妙,这么轻便的一站式代码就能够减轻那样多的事。学习的路还非常长啊,继续加油!!!

本文由澳门太阳娱乐集团官网发布于网页制作,转载请注明出处:第一篇:基本选择

上一篇:【澳门太阳娱乐集团官网】静态资源缓存与更新 下一篇:没有了
猜你喜欢
热门排行
精彩图文