在向数据库中添加新值时,IndexedDB会引发错误

时间:2017-05-03 09:27:56

标签: angularjs indexeddb

我在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);
});

我检查了桌子的名字。那是完全一样的。它的价值也分别是它们的关键。

如何解决此问题?你能否分享对这个错误的见解?

您的帮助将非常感谢。提前谢谢。

3 个答案:

答案 0 :(得分:2)

使用键路径创建对象库时:

 const store = db.createObjectStore('people', { keyPath: 'id' });

然后:

  1. 您还必须指定商店应使用密钥生成器,即{keyPath: 'id', autoIncrement: true},这将导致为您生成数字键(1,2,3,...)并注入值;或者:
  2. 您存储的值必须已包含与键路径匹配的属性,例如store.put({name: 'foo', id: 1234})
  3. (另外,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);