【发布时间】:2014-09-08 12:57:06
【问题描述】:
自从我更新到 WL6.2 后,我在 iOS (7.1.1) 上遇到了 JSONStore 问题。我的应用程序中有很多意外行为。我创建了一个测试应用程序来指示我的一些问题。只需创建一个新的 WL 项目并替换 main.js 文件并在 index.html 中添加一些按钮。
index.html:
<button id="destroyJSONStore">Destroy JSON Store</button>
<button id="search">Search</button>
<button id="load">Load</button>
main.js:
function wlCommonInit(){
document.getElementById("destroyJSONStore").onclick=function(){
WL.JSONStore.destroy()
.then(function() {
alert("JSON Store Destroyed");
});
};
document.getElementById("search").onclick=function(){
var query = {UserID: 1};
WL.JSONStore.get("Users").find(query)
.then(function(res) {
alert("Number of users found with ID 1: " + res.length);
})
.fail(function(errorObject) {
alert("Error loading user: " + userId + "\n" + errorObject.msg);
});
};
document.getElementById("load").onclick=function(){
var data = [{UserID: 1, Login: 'hvb'}];
var addOptions = {markDirty: true};
WL.JSONStore.get("Users").add(data, addOptions)
.then(function(added) {
alert("User successfully added; " + added);
})
.fail(function (errorObject) {
alert(errorObject.toString());
});
};
var collections = {
Persons : {
searchFields : {name: 'string', age: 'integer'}
}
};
var collections2 = {
Users : {
searchFields: { UserID: 'integer', Login: 'string'}
}
};
var options = {
username : 'jos',
password : 'jos',
localKeyGen : true
};
WL.JSONStore.init(collections, options)
.then(function () {
WL.Logger.debug("init persons ok");
})
.fail(function (errorObject) {
alert(errorObject.toString());
});
WL.JSONStore.init(collections2, options)
.then(function () {
WL.Logger.debug("init Users ok");
})
.fail(function (errorObject) {
alert(errorObject.toString());
});
}
应用程序第一次加载一切正常,如果您点击加载,则会在商店中添加一个新文档,如果您点击搜索,则会显示商店中的文档数量。然而,当我开始玩这个应用程序时,事情就出错了。关闭并打开应用程序几次并添加新文档。一段时间后,您会注意到搜索会不断返回相同数量的文档(无论您单击添加多少次)。
您还会注意到,一旦您销毁 json 存储并重新打开您的应用程序,您就会得到一个 JSON_STORE_DATA_PROTECTION_KEY_FAILURE。您必须再次重新启动应用程序才能摆脱它。
谁能告诉我我做错了什么? 我承认两次初始化 JSONSstore 可能看起来有点奇怪。但这是因为我们的应用程序是使用不同的模块构建的,并且在配置方面加载了不同的模块。根据文档,这不会导致任何问题:
可以使用不同的集合进行多次初始化。新集合的初始化不会影响已经初始化的集合。
顺便说一句:该应用在 Android 和移动浏览器模拟器上按预期运行。
【问题讨论】:
-
我不知道这是否是导致您的问题的原因,但是在您的代码中,您应该在第一个 init 之后的 then() 回调中执行第二个 init;否则,由于 JSONStore 是一个异步 API,它可能会导致奇怪的行为。您实际上可以简化此操作并同时初始化两个集合;只需将数组中的两个集合对象都传递给 init(即 init([collections, collections2], options)),它应该可以工作并使您更简单。
-
Daniel,你的话很有道理,我已经确信这会解决我的问题。我已经修改了我的代码,现在第二个 JSONStore 仅在第一个的 init 完成后才被初始化。但问题仍然存在。我知道我也可以一次完成两个集合的初始化,这可能会解决我的问题。但如前所述,我宁愿为不同的模块保留初始化。
-
Daniel,我已经测试了您的解决方法,事实上,如果我一次性初始化集合,这两个问题都得到了解决。但这只是一种解决方法,如果我两次初始化集合,它也应该可以工作。
-
好的,让我调查一下,看看能否重现该问题。
-
丹尼尔,我的承诺有问题,你是对的。问题是由于两个 init 语句同时执行。当我在 init 语句之间添加超时时,问题就消失了。我会更新我的问题并添加一个答案。感谢您的支持。
标签: ios ibm-mobilefirst jsonstore