使用Desktop Chrome,我使用Indexed DB for HTML5获得的另一个问题是,我无法从对象库中删除记录。 onsuccess事件被触发,但记录仍然存在...我的ID是一个时间戳只是因为我想更快地实现一个工作的应用程序。我硬编码但它仍然不起作用。这真的很奇怪,因为onsuccess事件被触发......
“执行此操作”的代码部分如下:
试 {
if (localDatabase != null && localDatabase.db != null)
{
var store = localDatabase.db.transaction("patients", "readwrite").objectStore("patients");
var request = store.delete("1384882073632");
request.onsuccess = function(event)
{
alert("Patient deleted from DB");
update_patients_stored();
aux1.value = "";
aux2.value = "";
aux3.value = "";
aux4.value = "";
};
request.onerror = function(event)
{
alert("Error deleting");
};
}
}
catch(e)
{
alert(e);
}
提前谢谢!
答案 0 :(得分:2)
我发现了类似的问题。非删除行为,但触发了onsuccess事件。尽管w3 IDBObjectStore.delete specification个状态键参数可以是任何类型,但我解决了它强制参数转换为数字:
//My version
//I use default autoIncrement for keys
var objectStore = db.createObjectStore(objStoreName,{autoIncrement:true});
//appears to need a number for the key (but retrieved from HTML as string
var request = db.transaction(objStoreName,'readwrite')
.objectStore(objStoreName)
.delete(Number(parent.id));
request.onsuccess = function(e) {
console.log("element deleted"); //sadly this always run :-(
}
所以你的第四行应该是:
var request = store.delete(1384882073632); //integer id
//rather than (WRONG):
//var request = store.delete("1384882073632"); //WRONG! string id
尝试过:
Chromium - Manjaro Linux上的版本50.0.2661.94(64位)
没有在其他环境或浏览器上测试过,但猜猜这是你的问题。
答案 1 :(得分:0)
我确定你要删除错误的密钥。请注意,如果与==进行比较,则数字,字符串和日期是不同的键,即使它们是相同的。
只要不违反数据库约束,IndexedDB就会返回成功。在这种情况下,不删除任何记录。我建议在删除请求中返回已删除记录的数量,但不赞成。我的图书馆,ydn-db,当然是这样做的。
答案 2 :(得分:0)
尝试将密钥放入数组中。
type IDBValidKey = number | string | Date | BufferSource | IDBArrayKey;
interface IDBArrayKey extends Array<IDBValidKey> {}
例如。
dbRequest.onsuccess = function (event: any) {
const db: IDBDatabase = event.target.result;
const transaction = db.transaction([albumStoreObjName], "readwrite");
transaction.oncomplete = () => {
subscriber.next();
subscriber.complete();
};
const objectStore = transaction.objectStore(albumStoreObjName);
const request = objectStore.delete([albumId]);
// ...
};