indexedDB是不可靠存储,会在c盘空间不足时,自动清空,极易丢失数据。
web的离线功能,就是能存一些数据,包括图片到本地,等可以上网的时候再把这些数据更新到服务器的数据库。
IndexedDB 具有以下特点
- IndexedDB 数据库是存储键值对的非关系型数据库。 IndexedDB 内部采用对象仓库(object store)存放数据。所有类型的数据都可以直接存入,包括 JavaScript 对象(不用像localStorage等需要存入json字符串)。库中,数据都是以"键值对"的形式保存,每一个数据记录都有对应的主键,主键是独一无二的,不能有重复,否则会抛出一个错误。
- IndexedDB API主要是异步的。 IndexedDB 操作时不会锁死浏览器,用户依然可以进行其他操作,这与 LocalStorage 形成对比,后者的操作是同步的。异步设计是为了防止大量数据的读写,拖慢网页的表现。
- IndexedDB 构建在事务数据库模型上。 IndexedDB 支持事务(transaction),这意味着一系列操作步骤之中,只要有一步失败,整个事务就都取消,数据库回滚到事务发生之前的状态,不存在只改写一部分数据的情况。
- 同源限制 IndexedDB 受到同源限制,每一个数据库对应创建它的域名。网页只能访问自身域名下的数据库,而不能访问跨域的数据库和跨浏览器访问。
- 储存空间大 IndexedDB 的储存空间比 LocalStorage 大得多,通常限制在 50MB 到 250MB,具体取决于浏览器和用户设置。
- 支持二进制储存。 IndexedDB 不仅可以储存字符串,还可以储存二进制数据(ArrayBuffer 对象和 Blob 对象)。
IndexedDB 虽好但是用法没有LocalStorage 简单,我们先来看下步骤与写法。
const database = {
name: 'myDatabase',
version: 1,
request: null,
};
// 打开数据库的请求
database.request = indexedDB.open(database.name, database.version);
// 监听数据库打开事件
database.request.onerror = (event) => {
console.error('Database error:', event.target.error);
};
// 监听数据库成功打开事件
database.request.onsuccess = (event) => {
console.log('打开数据库');
database.db = event.target.result;
// 你可以在这里执行其他操作,比如读取数据
readData();
};
function addData() {
// 确保数据库已打开
if (!database.db) {
console.log('数据库暂未打开');
return;
}
// 打开一个事务来添加数据
const transaction = database.db.transaction(['products'], 'readwrite');
const objectStore = transaction.objectStore('products');
// 添加数据到对象仓库
const product = {
id: '2',
name: 'Product 1',
price: 100,
};
const request.onsuccess和rqu = objectStore.add(product);
// request.onsuccess和request.onerror 处理成功失败事件
}
function readData() {
// 确保数据库已打开
if (!database.db) {
console.log('数据库暂未打开');
return;
}
// 打开一个事务来读取数据
const transaction = database.db.transaction(['products'], 'readonly');
const objectStore = transaction.objectStore('products');
objectStore.openCursor().onsuccess = (event) => {
var cursor = event.target.result
if (cursor) {
console.log('ID: ', cursor.value)
cursor.continue()
}
}
const request = objectStore.get('3');
transaction.oncomplete = function (event) {
console.log('Transaction completed');
// 这里可以执行一些事务完成后的清理工作
};
}
缺点
- 获取objectStrore去实现数据的存储和调用太麻烦了
- 并且还是异步的
IndexedDB API 是强大的,但对于简单的情况可能看起来太复杂。如果你更喜欢一个简单的 API,请尝试 localForage、dexie.js、PouchDB、idb、idb-keyval、JsStore 或者 lovefield 之类的库,这些库使 IndexedDB 对我们来说更加友好。
● 如果你的数据复杂且量大,IndexedDB 是不二之选。
● 如果你怕麻烦,直接用 上方提到的三方库(开发效率 +1)。
● 如果只是存个颜色偏好啥的,用 localStorage 够了。