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 的代码建议,不一定是您的代码无法删除项目的原因。
比较有意思的是:
数据库中要删除的对象的“id”属性 的值是多少?我假设您的对象看起来像 {id: "x", time: "y", ...}
.
你传递给函数的参数是什么?如果您要删除的对象看起来像上一个项目符号中描述的那样,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!
嗨,这是我的简单项目 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 的代码建议,不一定是您的代码无法删除项目的原因。
比较有意思的是:
数据库中要删除的对象的“id”属性 的值是多少?我假设您的对象看起来像
{id: "x", time: "y", ...}
.你传递给函数的参数是什么?如果您要删除的对象看起来像上一个项目符号中描述的那样,
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!