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"
构建
我有一个 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"
构建