Dexie.js 删除一个 ID 无效的项目

Dexie.js delete one item with id not working

嗨,这是我的简单项目 js 代码示例

 const deleteOneNote = (id) => {
    const db = openNoteDb();
    db.notes.where('id').equals(id).delete();
  }

  $(document).on("click", ".remove_note", function () {
    
    const id = $(this).parent().parent().attr("id");
    const db = openNoteDb();
    db.notes.where('id').above(-1).modify(result => {
      if (result.id == id) {
        deleteOneNote(result.id);
        window.location.reload(true)
      }
    })
  })

但是我的删除功能不起作用我不明白请帮助我..

首先,您的函数 deleteOneNote() 必须 return 来自 db.transaction() 的承诺,这样您就可以等待删除完成。或者使函数异步并等待由 db.transaction() 编辑的承诺 return。无论您选择什么,函数的调用者也必须在测试删除是否成功之前等待您的函数。

然后,我在代码上也看到了一个通病,就是创建了Dexie实例on-demand,这会导致内存泄漏,除非你完成后关闭它。相反,在 top-level 上声明 db,这样它就会在你的整个应用程序生命周期内存活,并让你的函数在任何地方都使用同一个 db 实例。

第三个常见错误(虽然可能不是这个原因)是人们在密钥存储为数字时提供字符串,反之亦然。确保提供给函数的 ID 与要删除的对象的类型不同。

// Declare one single Dexie instance in your entire application
// and use it from all functions.
const db = new Dexie("NotesDB");
// If you use modules, keep this code in a module and
// add an 'export' before 'const db = new Dexie("NotesDB");

db.version(1).stores({
  notes: `
  id,
  time,
  note,
  noteBackColor,
  noteTextColor,
  projectType,
  alarm`,
});

// Let you functions use the singleton Dexie instance:
const deleteOneNote = (id) => {
  return db.transaction('rw', db.notes, function () {
    // Note: Doing this in a transaction is over-kill, but ok.
    return db.notes.delete(id);
  }).catch((err) => {
    console.log(err);
    throw err; // Also, you probably want to rethrow the error...
  });
}

现在,这些是来自 Dexie's best-practices section 的代码建议,不一定是您的代码无法删除项目的原因。

比较有意思的是:

  1. 数据库中要删除的对象的“id”属性 的值是多少?我假设您的对象看起来像 {id: "x", time: "y", ...}.

  2. 你传递给函数的参数是什么?如果您要删除的对象看起来像上一个项目符号中描述的那样,id 参数的值必须恰好是字符串“x”——不是对象,也不是数组或任何其他类型——具有确切值的字符串"x".

此代码的工作测试是:

const foo = {id: "x", time: "y"};
db.notes.put(foo).then(async () => {
  if (await db.notes.get("x")) {
    console.log("My object is there!");
  } else {
    console.log("My object is not there!");
  }
  console.log("Now deleting it...");
  await deleteOneNote("x");
  if (await db.notes.get("x")) {
    console.log("My object is there!");
  } else {
    console.log("My object is not there!");
  }
}).catch(console.error);

运行 这个测试的结果应该是:

My object is there!
Now deleting it...
My object is not there!