Phonegap IndexedDb 未在 Windows Phone 10 中提交数据到较大的数据库

Phonegap IndexedDb not commiting data in Windows Phone 10 on larger databases

我有一个 phonegap 应用程序,它从 (CORS) 网络服务中提取数据并将其本地存储在 IndexedDB 中。

在 Android、iOS(使用垫片)和 Windows Phone 8.1 上一切正常,但在 Windows [=39= 上] 10 如果数据集很大,它不会完成交易,目前有 2 个特定的表失败,一个包含 276 条记录的某些项目(json 对象的总大小为 350KB),另一个包含 base64 照片数据16 条记录(json 对象大小刚刚超过 4MB),并没有那么大。

下面的代码是将数据保存到数据库中的代码:

getDataSingleTable: function (table, callback) {
    // get data for a single table
    if (!table) {
        // table name from array
        table = json_xfer.getTableList[json_xfer.currentGetTable];
    }

    var numRecords = 0;
    var anchor = '#li_get_' + table;
    var txt = $(anchor).html();
    $(anchor).html(txt + ' fetching...');

    // get data from CORS call
    json_xfer.corsGetdata(table, function (data) {
        // data is an array of json objects
        numRecords = data.length;
        console.log('fetched ' + table + ' ' + numRecords + ' row(s)');

        var trn = app.db.transaction([table], 'readwrite');
        var doDelete = xfer.latestUpds.length === 0;
        var obs = trn.objectStore(table);

        $(anchor).html(txt + ' applying ' + numRecords + ' row(s)...');
        var numSaved = 0;


        json_xfer.deleteLocalData(obs, doDelete, function () {
            if (numRecords === 0) {
                // in iOS if there's no records then trn.oncomplete will not be fired so
                // the code from that is now moved to another function we can call from here
                json_xfer.gotDataSingleTable(anchor, txt, numRecords);
            } else {
                // loop data
                data.forEach(function (row) {
                    // save data
                    var req = obs.put(row);
                    req.onerror = onIDBError;
                    req.onsuccess = function (event) {
                        numSaved++;
                        console.log('saved record ' + table + ' ' + row.id + ' ' + numSaved + '/' + numRecords);
                    };
                });
            }
        });

        trn.oncomplete = function () {
            console.log('trn.oncomplete(' + table + ')');
            if (callback) {
                callback();
            } else {
                if (numRecords > 0) {
                    json_xfer.gotDataSingleTable(anchor, txt, numRecords);
                }
            }

        };
        trnWrite.onabort = function() {
            console.log('transaction aborted');
        };
    });


},

它几乎是这样做的: 从 CORS 网络服务获取数据(returns JSON 数组) 清除数据存储 循环 JSON 数组并保存到 dataStore

在 Windows 10 中它到达最后一个 console.log(保存的记录照片 5b9200e3-4b33-4f4f-k0r3-2172139d36c3 16/16)但是 trn.oncomplete 永远不会被触发。 transaction.onAbort 确实被触发了

这似乎是一个大小问题,一旦数据库增长到一定大小(大约 2 到 4MB),对数据库的任何保存都会失败。

对外部函数的调用应该通过名称自解释。

解决方案是使用 "windows" 平台而不是 "wp8"

构建