<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>IndexedDB 简单示例</title>
<style>
body { font-family: sans-serif; max-width: 600px; margin: 40px auto; }
input, button { margin: 4px; padding: 6px 12px; }
#output { white-space: pre-wrap; background: #f5f5f5; padding: 12px; margin-top: 16px; border-radius: 4px; }
</style>
</head>
<body>
<h2>IndexedDB 简单示例</h2>
<div>
<input id="keyInput" placeholder="键 (key)" />
<input id="valueInput" placeholder="值 (value)" />
</div>
<div style="margin-top: 8px;">
<button onclick="setItem()">存数据</button>
<button onclick="getItem()">取数据</button>
<button onclick="removeItem()">删数据</button>
<button onclick="getAllData()">查询全部</button>
</div>
<div id="output">结果将显示在这里...</div>
<script>
const dbRequestsDic = {}
function getDatabase(DBName, tableName) {
return new Promise((resolve, reject) => {
dbRequestsDic[DBName] = dbRequestsDic[DBName] || indexedDB.open(DBName)
const request = dbRequestsDic[DBName]
if (request.readyState === 'done') {
const dataBase = request.result
if (dataBase.objectStoreNames.contains(tableName)) {
resolve(request.result)
} else {
const newVersion = dataBase.version + 1
dataBase.close()
const newRequest = indexedDB.open(DBName, newVersion)
newRequest.addEventListener('upgradeneeded', () => {
newRequest.result.createObjectStore(tableName, { keyPath: 'id' })
})
dbRequestsDic[DBName] = newRequest
newRequest.addEventListener('success', () => resolve(newRequest.result))
newRequest.addEventListener('error', reject)
}
} else if (request.readyState === 'pending') {
request.addEventListener('upgradeneeded', () => {
if (!request.result.objectStoreNames.contains(tableName)) {
request.result.createObjectStore(tableName, { keyPath: 'id' })
}
})
request.addEventListener('success', () => resolve(request.result))
request.addEventListener('error', reject)
}
})
}
class DBCache {
constructor(DBName, storageName) {
this.DBName = DBName
this.storageName = storageName
}
DBName
storageName
#getDB() {
return getDatabase(this.DBName, this.storageName)
}
#_getItem(key) {
return new Promise(async (resolve, reject) => {
const db = await this.#getDB()
const transaction = db.transaction([this.storageName])
const objectStore = transaction.objectStore(this.storageName)
const request = objectStore.get(key)
request.onerror = reject
request.onsuccess = function () {
resolve(request.result == undefined ? undefined : request.result.value)
}
})
}
setItem(key, data) {
return new Promise(async (resolve, reject) => {
const db = await this.#getDB()
const oldData = await this.#_getItem(key)
const transaction = db.transaction([this.storageName], 'readwrite')
const objectStore = transaction.objectStore(this.storageName)
let request
if (oldData) {
request = objectStore.put({ id: key, value: data })
} else {
request = objectStore.add({ id: key, value: data })
}
request.onsuccess = resolve
request.onerror = reject
})
}
getItem(key) {
return this.#_getItem(key)
}
removeItem(key) {
return new Promise(async (resolve, reject) => {
const db = await this.#getDB()
const transaction = db.transaction([this.storageName], 'readwrite')
const objectStore = transaction.objectStore(this.storageName)
const request = objectStore.delete(key)
request.onerror = reject
request.onsuccess = resolve
})
}
}
const cache = new DBCache('myDatabase', 'myStore')
async function setItem() {
const key = document.getElementById('keyInput').value.trim()
const value = document.getElementById('valueInput').value.trim()
if (!key || !value) return show('请输入键和值')
try {
await cache.setItem(key, value)
show(`存储成功: { id: "${key}", value: "${value}" }`)
} catch (e) {
show(`存储失败: ${e}`)
}
}
async function getItem() {
const key = document.getElementById('keyInput').value.trim()
if (!key) return show('请输入键')
try {
const result = await cache.getItem(key)
show(result !== undefined ? `查询结果: ${JSON.stringify(result)}` : `未找到 key="${key}"`)
} catch (e) {
show(`查询失败: ${e}`)
}
}
async function removeItem() {
const key = document.getElementById('keyInput').value.trim()
if (!key) return show('请输入键')
try {
await cache.removeItem(key)
show(`删除成功: key="${key}"`)
} catch (e) {
show(`删除失败: ${e}`)
}
}
async function getAllData() {
try {
const db = await getDatabase('myDatabase', 'myStore')
const request = db.transaction(['myStore'])
.objectStore('myStore')
.getAll()
request.onsuccess = (e) => {
const results = e.target.result
show(results.length ? `全部数据:\n${JSON.stringify(results, null, 2)}` : '仓库为空')
}
request.onerror = (e) => show(`查询失败: ${e.target.error}`)
} catch (e) {
show(`查询失败: ${e}`)
}
}
function show(msg) {
document.getElementById('output').textContent = msg
}
</script>
</body>
</html>