-
Notifications
You must be signed in to change notification settings - Fork 0
/
indexDB.js
211 lines (200 loc) · 6 KB
/
indexDB.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
let db = null
let createIndexName = 'siteid'
// indexedDB 的容量限制是当前浏览器存放的物理硬盘大小的50%,如果超过50%则会抛出异常: QuotaExceededError
/**
* 初始化数据库
* @returns {String}
* {String} dbName 数据库名称
* {String} autoIncrement 是否自动建立索引
* {String} version 版本号默认为1
* {function} callback 回调函数
*/
export const $initDBbase = (dbName, autoIncrement = true, version, callback) => {
// 打开数据库
let request = window.indexedDB.open(dbName, 1)
// 数据库得到结果(最后执行)
request.onsuccess = event => {
db = request.result
callback(db)
}
request.onerror = event => {
console.log('创建数据库失败...')
}
// 创建数据库
request.onupgradeneeded = event => {
db = event.target.result
let objectStore
// 判断数据库是否存在
if (!db.objectStoreNames.contains(dbName)) {
objectStore = db.createObjectStore(dbName, { keyPath: 'id', autoIncrement })
// objectStore.createIndex('id', 'id', { unique: true }) // 创建 id 索引,具有唯一性
objectStore.createIndex(createIndexName, createIndexName, { unique: false })
}
}
}
/**
* 新增数据
* @returns {String}
* {String} dbName 数据库名称
* {String} id 索引键
* {String} data 需要新增数据
*/
export const $addDBbase = (dbName, data, res) => {
return new Promise((resolve, reject) => {
if (!isNUll(dbName)) return
let request = db.transaction([dbName], 'readwrite').objectStore(dbName).add(data)
request.onsuccess = event => {
// console.log('数据写入成功!')
resolve(event.target.result)
}
request.onerror = event => {
reject(event)
// console.log('数据写入失败...')
}
})
}
// export const $addDBbase = (dbName, id, data) => {
// // 新建相同索引的数据,必须先判断是否已经存在,不能重复插入相同主键的数据
// let tempData = db.transaction([dbName], 'readwrite').objectStore(dbName).get(id)
// tempData.onsuccess = event => {
// if (!event.target.result) {
// let request = db.transaction([dbName], 'readwrite').objectStore(dbName).add(data)
// request.onsuccess = event => {
// // console.log('数据写入成功!')
// }
// request.onerror = event => {
// // console.log('数据写入失败...')
// }
// } else {
// // console.log('此条数据已存在!')
// }
// }
// }
/**
* 更新数据
* @returns {String}
* {String} dbName 数据库名称
* {String} data 需要更新的数据
*/
export const $updateDBbase = (dbName, data) => {
if (!isNUll(dbName)) return
let request = db.transaction([dbName], 'readwrite').objectStore(dbName).put(data)
request.onsuccess = event => {
// console.log('数据更新成功!')
}
request.onerror = event => {
// console.log('数据更新失败...')
}
}
/**
* 读取数据指定索引键的数据
* @returns {String}
* {String} dbName 数据库名称
* {String} id 索引键
* {String} data 需要读取的数据
*/
export const $readDBbase = (dbName, id, callback) => {
if (!isNUll(dbName)) return
let request = db.transaction([dbName]).objectStore(dbName).get(id)
request.onerror = event => {
// console.log('事务失败...')
}
request.onsuccess = event => {
if (request.result) {
callback(request.result)
} else {
callback(null)
// console.log('未获得数据记录...')
}
}
}
/**
* 读取数据指定索引键的数据
* @returns {String}
* {String} dbName 数据库名称
* {String} id 索引键
* {String} data 需要读取的数据
*/
export const $readIndexDBbase = (dbName, index, value, callback) => {
if (!isNUll(dbName)) return
let request = db.transaction([dbName]).objectStore(dbName).index(index).getAll(value)
request.onerror = event => {
// console.log('事务失败...')
}
request.onsuccess = event => {
if (request.result) {
callback(request.result)
} else {
callback(null)
// console.log('未获得数据记录...')
}
}
}
/**
* 获取数据库所有数据
* @returns {String}
* {String} dbName 数据库名称
*/
export const $getAllDBbase = dbName => {
if (!isNUll(dbName)) return
let request = db.transaction([dbName], 'readwrite').objectStore(dbName).getAll()
request.onsuccess = event => {
if (event.target && event.target.result && event.target.result.length > 0) {
// console.log('获取全部数据成功!', event.target.result)
}
}
request.onerror = event => {
// console.log('获取全部数据失败...')
}
}
/**
* 删除数据
* @returns {String}
* {String} dbName 数据库名称
* {String} id 索引键
*/
export const $removeDBbase = (dbName, id) => {
if (!isNUll(dbName)) return
let request = db.transaction([dbName], 'readwrite').objectStore(dbName).delete(id)
request.onsuccess = event => {
// console.log('数据删除成功!')
}
request.onerror = event => {
// console.log('数据更新失败...')
}
}
/**
* 删除数据库
* @returns {String}
* {String} dbName 数据库名称
*/
export const $deleteDBbase = dbName => {
// 关闭数据库
db.close()
// 删除数据库
let request = window.indexedDB.deleteDatabase(dbName)
request.onsuccess = event => {
// console.log('数据库删除成功!')
}
request.onerror = event => {
// console.log('数据库删除失败...')
}
}
/**
* 删除数据库所有内容
* @returns {String}
* {String} dbName 数据库名称
*/
export const $clearDBbase = dbName => {
if (!isNUll(dbName)) return
db.transaction([dbName], 'readwrite').objectStore(dbName).clear()
}
// 判断数据库是否为空
const isNUll = dbName => {
if (!db) return false
const transaction = db.transaction([dbName], 'readwrite')
if (!transaction) return false
const objectStore = transaction.objectStore(dbName)
if (!objectStore) return false
return true
}