使用Image添加记录时,IndexedDB崩溃

时间:2017-10-11 10:43:15

标签: javascript base64 indexeddb

当我将一个图像(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。此外,其他添加/删除操作对其他事务处理工作正常。

1 个答案:

答案 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");

至于为什么你有时只会遇到错误?我的猜测是小字符串操作更快,因此事务不会超时,但是对于较大的对象,请求速度较慢,因此超时实际发生。