我在IndexedDb中成功创建了一个数据库但是当我尝试在数据库中添加一个值时,我看到以下错误:
DOMException:无法在'IDBObjectStore'上执行'add':评估 对象存储库的关键路径没有产生值。
代码段:
let db = new AngularIndexedDB('myDb', 1);
db.createStore(1, (evt) => {
const objectStore = evt.currentTarget.result.createObjectStore('people', { keyPath: 'id', unique: true });
objectStore.createIndex("name", "name", { unique: false });
objectStore.createIndex("email", "email", { unique: true });
}).then(() => {
db.add('people', { name: 'name', email: 'email' }).then(() => {
}, (error) => {
console.log(error);
});
}, (error) => {
console.log(error);
});
我检查了桌子的名字。那是完全一样的。它的价值也分别是它们的关键。
如何解决此问题?你能否分享对这个错误的见解?
您的帮助将非常感谢。提前谢谢。
答案 0 :(得分:2)
使用键路径创建对象库时:
const store = db.createObjectStore('people', { keyPath: 'id' });
然后:
{keyPath: 'id', autoIncrement: true}
,这将导致为您生成数字键(1,2,3,...)并注入值;或者:store.put({name: 'foo', id: 1234})
(另外,unique
不是对象存储的属性,只是索引。对象在对象库中始终是唯一的。)
答案 1 :(得分:0)
对于那些面临TypeScript属性类似问题的人。
假设我们有这个模型
export default class Model {
private _id: number;
public get id(){
return this._id;
}
public set id(value: number){
this._id = value;
}
}
像这样初始化对象存储
db.createObjectStore('Models', {
keyPath: 'id'
});
然后我们要保存模型
let model = new Model();
let ts = db.transaction('Models', "readwrite");
let store = ts.objectStore('Models');
store.add(model);
很遗憾,我们会收到
DOMException: Failed to execute 'add' on 'IDBObjectStore': Evaluating the object store's key path did not yield a value.
那是因为现在IndexedDB难以解释我们的转译模型(我不知道为什么,它可能与tsconfig.json相关吗?)
一旦我们将模型更改为
export default class Model {
public id: number;
}
然后尝试保存它,我们将成功完成交易。
答案 2 :(得分:0)
在我的情况下,当我试图通过保存对键分配了“未定义”键的记录的深层副本来强制IndexDB在数据库中创建记录的副本时出现此错误。 显然,诀窍是从对象中删除属性:
const record: T = JSON.parse(JSON.stringify(r));
r.key = undefined; // does not work!
delete(r.key); // works! with autoincrement it forces IndexDB to create a new key
await datastore.add(record);