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的监视模式

监视模式是客户端的一个功能,这个功能允许你当你改变样式的时候,客户端将自动刷新。

要使用它,只要在URL后面加上’#!watch’,然后刷新页面就可以了。另外,你也可以通过在终端运行less.watch()来启动监视模式。

这些是less的基本使用方法,更多功能和高级用法,可以查看api文档。

数据库:

const 修饰,代表永远是只读的,不能被修改常量的定义 以及强制类型转换const
filename = “abc.txt”const 数值可作为各种类型使用函数时编程如何把 4,5
转换成5,4main(){fist =100maix = 200fist,maix =
maix,fist}变量的作用域1,在函数内部声明的变量叫做局部变量,生命周期仅限于函数内部2,在函数外部声明的变量叫做全局变量,生命周期作用于整个包,如果是大写的则作用于整个程序int
8 一个字节 int16 俩字节 int32 四个字节 int64 八个字节uint
无符号整形生成随机数matn/randrand.Int()字符类型: var a byte
8位一个字节字符串类型:var str string占位符%v 相应值的默认格式%#v
响应值的go语法表示%T 相应值的类型的Go语法表示%%
字符上的百分号,并非占位符%t 单词true或false整数%b 二进制表示%c
相应Unicode码点所表示的字符%d 十进制表示%o 八进制表示%q
单引号围绕的字符字面值,由go语法安全地转义%x
十六进制表示,字母形式为小写 a-f%X 十六进制表示,字母形式为大写A-F%U
Unicode格式浮点数%b 无小数部分的%f 有小数点而无指数字符串与字节切片%s
字符串或切片%q 双引号围绕的字符串%x
十六进制,小写字母,每个字节俩个字符%X
十六进制,大写字母,每个字节俩个字符//字符串翻转func reverse(str string)
string{var result stringstrLen :=lenfor i := 0; i<strLen; i++{result
=result+fmt.Sprintf(“%c”,str[strLen-i-1])}return result}

一、使用indexedDB的基本模式

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

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

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

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

什么是数据库?简单来说就是存数据的。

func main(){var str1 =”hello”result
:=reversefmt.Println}fmt.Scanf(“%d”,&n)获取控制台输出//水仙花func
isNumber bool{var i,j,k inti = n % 10j = %10k = %10sum := iii + jjj

二、创建、打开数据库

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开发的图片加载框架,它的使用方式极其简便,简直令人发指。当然,我们要使用它,首先要添加依赖:

都有什么是数据库?

  • kkkreturn sum == n}

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

在关系型数据库(如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′

oracle(强大,跟金融政府打交道的,安全,付费的) mysql sql-server DB2…

func main(){var n int = 100var m int =999

四、增加和删除数据

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

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

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

mysql免费 轻便相对于oracle 官网下载:

for i := n; i <m; i++{if isNumber == true{fmt.Println}

向数据库中增加数据

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

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()不同之处在于,数据库中若存在相同主键或者唯一性索引重复,则会更新该条数据,否则插入新数据。

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

用wamp中的m

}}

从数据库中删除数据

删除数据使用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( );**

数据库分为两部分:客户端和服务端;

strings 和strconvstrings.HasPrefix(s string,prefix string) bool
判断字符串s是否以prefix开头stirngs.HasSuffix(s string,suffix string)
bool, 判断字符串s是否以suffix结尾strings.Index(s string,str string) int
判断str在s中首次出现的位置,如果没有出现则返回-1strings.LastIndex(s
string,str string) int
判断str在s中最后出现的位置,如果没有出现,则返回1string.Replace(str
string, old string,new string,n int),字符串替换strings.Count(str
string,substr string)int 字符串计数strings.Repeat(str string,count int)
string 重复count次strstrings.ToLower(str string)
string:转为小写strings.ToUpper(str string) string
转为大写时间和日期类型time包time.Time类型,用来表示时间获取当前时间 now
:=time.Now()time.Now
,time.Now().Minute(),time.Now,time.Now指正的类型普通类型,变量存的就是值,也叫值类型获取变量的地址,用&,比如
var a int
,获取a的地址:&a指针类型,变量存的是一个地址,这个地址存的才是值获取指针类型所指向的值,使用:*
比如var p int 使用p获取p指向的值goto 类似于for循环label1如果j == 4
就直接结束当前for循环执行父类func main(){LABEL1:for i := 0;i <=5 ;i++
{for j := 0;j<=5;j++{if j ==4 {continue LABEL1}fmt.Println(“i
is:%d,and j is:%d\n”,i,j)}}}函数声明语法:func 函数名[]golang
函数的特点不支持重载,一个包不能有个俩个名字一样的函数函数是一等公民,函数也是一种类型,一个函数可以赋值给变量匿名函数多返回值//可变参数func
add(a int, arg …int)int {var sum int = afor i :=0; i<len;i++{sum
+=arg[i]}return sum}func main(){sum
:=addfmt.Println}//可变参数字符串拼接func add(a string, arg
…string)(result string) {result = afor i :=0; i<len; i++{result +=
arg[i]}return}func main(){sum
:=add(“hello”,”word”)fmt.Println}函数defer用途:当函数返回时,执行defer语句,因此可以用来做资源清理多个defer语句,按先进后出的方式执行defer语句中的变量,在defer声明时就觉定了for
i :=0;i<10;i++{deferfmt.Println}打印10 9 8。。。。1defer用途
锁资源释放func read(){mc.LockI()defer mc.Unlock()}数据库连接的释放func
read(){conn :=openDatabase()defe
conn.Close()}内置函数close:主要用来关闭channellen:用来求长度,比如string,array,skice,map,channelnew
用来分配内存,主要用来分配值类型,比如int,struct,返回的是指针make:用来分配内存,主要用来分配引用类型,比如chan,map,sliceappend:用来追究元素到数组,slice中panic和recover;用来做错误处理//斐波那契数func
fab int{if n <=1 {return 1}return fab +fab}func main(){for i := 0;
i<10;i++{n:=fabfmt.Println}}数组:是同一种数据类型的固定长度的序列切片:切片是数组的一个引用,因此切片是引用类型切片的长度可以改变,切片是一个可变的数组通过make来创建切片切片拷贝s1
:= [] int(1,2,3,4,5)s2 :=makecopy切片s3 :=[]int{1,2,3}s3 =
append(s3,s2 …)排序操作 使用sort包 importsort.Ints 对整数进行排序func
testIntSort(){var a =
[…]int{1,8,38,2,144}sort.Intsfmt.Println}sort.Strings
对字符串进行排序,sort.Float64 对浮点型进行排序map 数据结构ket -value
的数据结构,又叫做字典或者关联数组map
数据结构map排序a.先获取所有key,把key进行排序b.按照排序好的key,进行遍历线程同步impoty互斥锁,var
mu sync.Mutex读写锁 var mu sync.RWMutex写多的时候加互斥
读多的时候加读写锁

从数据中获取数据

获取数据使用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()

其中包含三个方法:

node npm install mysql

在对象存储空间上使用游标

使用游标常见的一种模式是获取对象存储空间上的所有数据.

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” 前面的,
但是不需要包括 “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);

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()。这个方法用于指定图片加载到哪个图片控件上。

navicat的使用:

八、indexedDB的局限性

以下情况不适合使用IndexedDB

  • 全球多种语言混合存储。国际化支持不好。需要自己处理。
  • 和服务器端数据库同步。你得自己写同步代码。
  • 全文搜索。

注意,在以下情况下,数据库可能被清除:

  • 用户请求清除数据。
  • 浏览器处于隐私模式。最后退出浏览器的时候,数据会被清除。
  • 硬盘等存储设备的容量到限。
  • 不正确的
  • 不完整的改变.

这就是Glide最基本的使用方式。看到这,你就能很好的加载图片资源到ImageView上了。

1.连接数据库

总结

  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加载的时候出现异常的情况(如:手机网络异常,图片不存在等)下展示的一张图片,也是为了完善用户体验。

主机名或ip地址

指定图片格式

在我们加载一张图片时,Glide可以帮我们判断图片的格式(Glide默认是支持gif动态图的)。

asBitmap( )  →
说明只能加载静态图片,如果传入的是一张动态图,则只显示图片的第一帧。

asGif(  )
→说明只能加载动态图,如果传入的是一张静态图,则会加载失败。

端口

指定图片大小

在实际的使用Glide中,由于Glide的智能性,我们绝大多数情况下是不用指定图片的大小的,Glide会自动判断ImageView的大小,然后只将这么大小的图片加载到内存中,帮我们减少内存使用,避免造成内存溢出。但是,我们还是可以指定Glide加载图片的大小的:

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


到这里,就基本了解Glide的基本使用了。哈哈,感觉还不错吧,用起来Glide还是感觉很不错的,至少我感觉还是很神奇,这么简单的一行代码就能解决这么多的事。学习的路还很长啊,继续加油!!!

用户名密码

mysql(电脑) 库(文件夹) 表单(相当于文件) 存数据

纵向(列):字段

横向(行):一条数据

2.建立

a)建库

点击右键-新建数据库

名称:理论上都行

字符集:utf-8

排序规则:utf8_general_ci 通用排序

b)建表

点击表

类型

int 整数

varchar 字符串

c)插入数据

sql语言(语句) DBA专门玩这个的

INSERT INTO 表名 VALUES(id,content,user)

注:值的顺序和表字段的顺序要一致

DELETE FROM 表名 //把整个表删了

DELETE FROM 表名 WHERE id=12;

UPDATE 表 SET 字段=新的值,字段=新的值 WHERE id=12

eg:UPDATE 表 SET content=XXX,user=XXX WHRER id=12

把id为12的内容改为。。

SELECT 字段名,content,id,user FROM 表名

SELECT * 表名 获取全部字段

1.下载mysql

2.引入mysql

3.连接数据库

var
db=mysql.createConnection({“host”:”localhost”,”user”:”root”,”password”:”
“,”database”:””});

host域名

发表评论

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

网站地图xml地图