【发布时间】:2017-09-17 09:39:54
【问题描述】:
我正在使用 sapui5 框架 v1.44 和 indexedDB 开发一个基于科尔多瓦的多平台网络应用程序来存储数据。该应用程序运行良好,直到最后一次 ios 更新 10.3.1,现在它在尝试编写时崩溃到索引数据库。我正在使用 put 方法更新数据,并且我对应用程序进行了全新安装。我尝试写入 indexedDB 的代码框架是这样的:
writeToIDB: function (objStoreName, result, success, error) {
//Asynchronous function
var defer = Q.defer();
var res = [];
if (!!result && Array.isArray(result)) {
res = result;
} else if (!!result && result.hasOwnProperty("results") && Array.isArray(result.results)) {
res = result.results;
} else if (!!result && typeof result === 'object') {
res.push(result);
}
if (res.length >= 0) {
if (window.myDB) {
if (!window.myDB.objectStoreNames.contains(objStoreName)) {
console.log("ObjectStore for " + objStoreName + " doesn't exist");
if (error) {
error("ko")
} else {
defer.reject("ko");
}
} else {
var oTransaction = window.myDB.transaction([objStoreName], "readwrite");
var oDataStore = oTransaction.objectStore(objStoreName);
oTransaction.oncomplete = function (event) {
console.log("Transaction completed: database modification for " + objStoreName + " finished.");
if (success) {
success();
} else {
defer.resolve("ok");
}
};
oTransaction.onerror = function (event) {
console.log("Transaction for " + objStoreName + " not opened due to error. Check for duplicate items or missing properties!");
console.log(event.target.error);
if (error) {
error("ko")
} else {
defer.reject("ko");
}
};
var oRecord = {};
for (var i = 0; i < res.length; i++) {
oRecord = res[i];
oDataStore.put(oRecord);
}
}
} else {
this.createIDB().then(
function (resCreate) {
console.log("DB Created successfully");
if (!window.myDB.objectStoreNames.contains(objStoreName)) {
console.log("ObjectStore for " + objStoreName + " doesn't exist");
if (error) {
error("ko")
} else {
defer.reject("ko");
}
} else {
var oTransaction = window.myDB.transaction([objStoreName], "readwrite");
var oDataStore = oTransaction.objectStore(objStoreName);
oTransaction.oncomplete = function (event) {
console.log("Transaction completed: database modification for " + objStoreName + " finished.");
if (success) {
success();
} else {
defer.resolve("ok");
}
};
oTransaction.onerror = function (event) {
console.log("Transaction for " + objStoreName + " not opened due to error. Check for duplicate items or missing properties!");
console.log(event.target.error);
if (error) {
error("ko")
} else {
defer.reject("ko");
}
};
var oRecord = {};
for (var i = 0; i < res.length; i++) {
oRecord = res[i];
oDataStore.put(oRecord);
}
}
}.bind(this),
function (err) {
console.log("DB Creation failed");
if (error) {
error("ko")
} else {
defer.reject("ko");
}
}.bind(this)
);
}
} else {
if (error) {
error("ko")
} else {
defer.reject("ko");
}
}
if (typeof success === 'undefined' && typeof error === 'undefined') {
return defer.promise;
}
},
P.S.我省略了部分代码。 这在以前版本的 ios 上运行良好,我想我已经安装了 10.2.1,现在它在调用 put 方法后就崩溃了。我现在尝试将 ios 升级到 10.3.2 的测试版,但结果是一样的。其他人注意到这一点或对如何解决此问题有任何想法吗? 谢谢 克
更新 我发现了问题:复杂的数据类型。由于 IndexedDB 支持保存和检索复杂的数据类型,因此我有一些属性,它们是我用来保存在一些 ObjectStore 中的数组或对象。这对我来说绝对是一个大问题,因为我能想到的唯一解决方法是扼杀复杂的字段,但由于我处理大量数据,这会产生很大的性能问题。我希望ios开发团队能尽快找到解决方案
【问题讨论】:
-
控制台有错误吗?
-
不,一个也没有
标签: ios cordova crash offline indexeddb