当我将一个图像(2-3mb base64字符串)添加到我的indexedDB中时,使用来自iPad / Safari的网络应用程序似乎崩溃了(在Chrome桌面上工作正常)。
InvalidStateError (DOM IDBDatabase Exception 11): Failed to execute 'transaction' on 'IDBDatabase': The database connection is closing.
尝试插入的对象:
{
categoryNo: "C0103"
imageData: [{base64Image: "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAASABIAAD…aUOUbIHsTUsVwQRZJF8/94dMe9TxKzK7ugwhK1s4su8T/2Q==",
imageUploaded: false
}
我已经使用indexedDB来存储字符串,它正常工作,就像我尝试使用base64图像添加对象一样。
bcUpdateIDB: function(sInspectionNo, sLineNo, sCategory, oRecord){
var oController = this;
var objectStore = oController.myDB.transaction("imageDB").objectStore("imageDB");
var items = [];
objectStore.openCursor().onsuccess = function(event) {
var cursor = event.target.result;
if (cursor) {
items.push(cursor.value);
cursor.continue();
} else {
dataRecords = items;
var oTransaction = oController.myDB.transaction(["imageDB"], "readwrite");
var oDataStore = oTransaction.objectStore("imageDB");
var recordFound = false;
for (var i=0; i<dataRecords.length;i++){
var oDataRecord = dataRecords[i];
if(oDataRecord.lineNo === sLineNo && oDataRecord.inspectionNo === sInspectionNo && oDataRecord.category === sCategory){
recordFound = true;
oDataStore.delete(oDataRecord.id);
if(oRecord.imageData.length > 0){
oDataStore.add(oRecord);
}
}
}
if(!recordFound){
oDataStore.add(oRecord);
}
}
};
在Safari中它似乎挂在&#39; .add()&#39;,这适用于Chrome。此外,其他添加/删除操作对其他事务处理工作正常。
答案 0 :(得分:1)
此错误与您尝试存储的 无关。当您尝试在代码中的数据库中存储对象时,此错误是由引起的。您没有发布足够数量的代码来调查和解释问题。
在不知道代码是什么样的情况下,我猜是通常的代码。不要使用全局数据库变量。更熟悉如何编写异步javascript。
编辑:
根据您的修订版,我的下一个猜测是您从另一个交易中开始新的交易。在没有更多请求处理使用该事务的时间点之后,事务会在一段时间后自动结束。错误消息表明事务处于非活动状态,这意味着在事务结束的时间点之后,您进行了一些请求调用(request.add,request.remove等)。
有很多方法可以修复它,但如果没有两个复杂的方法,请尝试以下方法。每当您要执行未知数量的请求时,请为所有内容共享相同的事务。使用一个事务而不是两个。这将使交易保持活跃。
简言之:
bcUpdateIDB: function(sInspectionNo, sLineNo, sCategory, oRecord){
var oController = this;
var oTransaction = oController.myDB.transaction("imageDB", "readwrite");
var objectStore = oTransaction.objectStore("imageDB");
// ...
} else {
dataRecords = items;
// Now this reuses the one transaction instead of a new one
var oDataStore = oTransaction.objectStore("imageDB");
至于为什么你有时只会遇到错误?我的猜测是小字符串操作更快,因此事务不会超时,但是对于较大的对象,请求速度较慢,因此超时实际发生。