Файл изображения не добавляется в indexddb - временная проблема - PullRequest
0 голосов
/ 11 мая 2018

Мы используем indexeddb для реализации фоновой синхронизации с сервисным работником.

Он работает нормально на всех системах, однако периодически он не может добавлять изображения в indexeddb, не получая сообщений об ошибках, только с предупреждением, что "данные могут быть устаревшими ".Ниже приведен пример кода.

Проблема была воспроизведена на мобильном браузере Chrome версии 66

function storetoIndexeddb(id, file) {
        var docID = ''


        docID = $scope[id]
        var file = file;
        var file64 = null;

        // IndexedDB
        var indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.OIndexedDB || window.msIndexedDB,
            IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.OIDBTransaction || window.msIDBTransaction,
            dbVersion = 1;
        var dbName = "testDb",
            db;

        if (!indexedDB) {
            alert("Your browser doesn't support a stable version of IndexedDB. Such and such feature will not be available.");
        }

        // Create/open database
        var request = indexedDB.open(dbName, dbVersion);

        request.onerror = function(event) {
            console.log("Error creating/accessing IndexedDB database");
        };

        request.onsuccess = function(event) {
            console.log("Success creating/accessing IndexedDB database");
            db = event.target.result;
            db.onerror = function(event) {
                console.log("Error creating/accessing IndexedDB database");
            };
            // Interim solution for Google Chrome to create an objectStore. Will be deprecated
            if (db.setVersion) {
                if (db.version != dbVersion) {
                    var setVersion = db.setVersion(dbVersion);
                    setVersion.onsuccess = function() {
                        createObjectStore(db);
                        putScreenshotInDb();
                    };
                } else {
                    putScreenshotInDb();
                }
            } else {
                putScreenshotInDb();
            }
        };

        request.onupgradeneeded = function(event) {
            createObjectStore(event.target.result);
        };

        function createObjectStore(dataBase) {
            dataBase.createObjectStore("saveData");
        }

        function putScreenshotInDb() {

            var request = indexedDB.open(dbName, dbVersion);

            request.onerror = function(event) {
                console.log("Error creating/accessing IndexedDB database");
            };

            request.onsuccess = function(event) {
                console.log("Success creating/accessing IndexedDB database");
                db = event.target.result;
                db.onerror = function(event) {
                    console.log("Error creating/accessing IndexedDB database");
                };
                // Interim solution for Google Chrome to create an objectStore. Will be deprecated
                transaction = db.transaction(["saveData"], "readwrite");

                transaction.oncomplete = function(event) {
                    console.log('complete', event)
                };
                transaction.onerror = function(event) {
                    console.log('erooor', event)
                };
                var putreq = transaction.objectStore("saveData")
                putreq.put(file, $routeParams.serviceRequestId + 'XXX' + $scope.inspectData.assetId + "XXX" + docID + 'XXXinspImage');

                $scope.imageStorageRef[id].uploaded = true;
                $scope.loading = false;

            };



        }
    }

1 Ответ

0 голосов
/ 24 мая 2018

Я нашел вероятную причину такого поведения indexeddb, а также мог повторить ту же проблему на физическом устройстве.

Индексированная БД хранит данные в физической памяти и, как показывает страница Рекомендации по индексированной БД , в случае, если на устройстве не хватает памяти, Android может не выделить память для браузера и, следовательно, для дб. В приведенном выше сценарии операция indexeddb put выполняется в виде обратного вызова success и не выдает ни ошибки, ни файла, добавляемого в память. Необходимо выполнить операцию get в независимой транзакции для подтверждения
успех put.

...