objectStore.get() 是 IndexedDB 中根据主键精确获取单条数据的核心方法,需确保数据库已打开、事务激活、对象仓库就绪,并传入类型匹配的主键值,返回 Promise 封装更易用。

使用 objectStore.get() 根据主键 ID 获取单条数据,是 IndexedDB 中最基础也最常用的操作。关键在于确保数据库已打开、对象仓库(object store)已正确获取,并传入有效的主键值。
确认数据库和对象仓库已就绪
必须在 onsuccess 回调或 await db 之后操作,不能在 onupgradeneeded 中直接调用 get(),因为此时事务尚未激活或对象仓库可能还未完全初始化。
- 打开数据库时指定版本号,确保对象仓库存在
- 用
transaction.objectStore("storeName")明确获取目标对象仓库 - 避免在
db.close()后调用get(),否则会报 “InvalidStateError”
调用 get() 并处理返回结果
get() 接收一个参数:主键(key),可以是数字、字符串、Date、Array 等符合主键类型的值。它返回一个 IDBRequest 对象,需监听其 onsuccess 或用 await(配合 Promise 包装)。
- 成功时,
event.target.result是匹配的数据对象;若无匹配项,结果为undefined - 失败时(如主键类型不匹配、事务已中止),触发
onerror,应做错误捕获 - 示例:
const request = store.get(123); request.onsuccess = () => { console.log(request.result); };
推荐写法:封装为 Promise 更易用
原生 API 基于事件,配合 async/await 更简洁。可用 new Promise 封装:
function getById(db, storeName, id) {
return new Promise((resolve, reject) => {
const tx = db.transaction(storeName, 'readonly');
const store = tx.objectStore(storeName);
const req = store.get(id);
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
}
// 使用
const data = await getById(db, 'users', 5);
console.log(data); // { id: 5, name: "张三" }
注意主键类型与索引区别
get() 只能按主键精确查找,不支持范围查询或按其他字段检索。如果想按非主键字段查,需先创建索引,再用 index.get()。
- 主键由
createObjectStore(..., { keyPath: 'id' })或autoIncrement: true定义 - 传给
get()的值必须与主键类型一致,比如主键是字符串"100",就不能传数字100(除非开启keyPath自动转换且值可隐式转换) - 对自增主键,
get(0)不会命中第一条记录(因自增从 1 开始),需确认实际主键值

















