Worklight 6.2 iOS上的JSONStore问题

Worklight 6.2 iOS上的JSONStore问题,ios,ibm-mobilefirst,jsonstore,Ios,Ibm Mobilefirst,Jsonstore,自从更新到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>

自从更新到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>
应用程序第一次加载所有内容时工作正常,如果单击“加载”,则会在应用商店中添加新文档,如果单击“搜索”,则会显示应用商店中的文档数。然而,当我开始玩这个应用程序时,事情就出了问题。关闭并打开应用程序数次,然后添加新文档。过了一会儿,您会注意到搜索会不断返回相同数量的文档(无论您单击“添加”多少次)

您还将注意到,一旦销毁json存储并重新打开应用程序,就会出现json存储\数据\保护\密钥\失败。您必须再次重新启动应用程序才能摆脱它

有人能告诉我我做错了什么吗? 我承认两次初始化JSONStore可能有点奇怪。但这是因为我们的应用程序是用不同的模块构建的,关于配置,加载了不同的模块。根据文件,这不应导致任何问题:

可以使用不同的集合多次初始化。初始化新集合时不会影响已初始化的集合


顺便说一句:该应用程序在Android和移动浏览器模拟器上都能正常工作。

我想我知道问题出在哪里;您在destroy()调用后显示一个警报,并认为看到该警报意味着销毁已完成,但事实并非如此;destroy()也是一个异步API调用,因此与init一样,您必须使用承诺/回调来执行警报。例如:

WL.JSONStore.destroy()
.then(function(){
     alert('Destroy is done!');
});

正如Daniel所建议的,问题在于两个init方法同时执行。这会导致奇怪的行为。解决方案是在第一个init完成后调用第二个init。下面是一个如何做到这一点的示例

WL.JSONStore.init(collections, options)
.then(function () {
    WL.Logger.debug("init persons ok");
})
.then(function() {
    WL.JSONStore.init(collections2, options)
   .then(function () {
       WL.Logger.debug("init Users ok");
   })
   .fail(function (errorObject) {
       alert(errorObject.toString());
   });
})
.fail(function (errorObject) {
    alert(errorObject.toString());
});

我不知道这是否是导致问题的原因,但在代码中,应该在第一次初始化之后的then()回调中执行第二次初始化;否则,由于JSONStore是一个异步API,它可能会导致奇怪的行为。实际上,您可以简化此过程并同时初始化两个集合;只需将数组中的两个集合对象传递给init(即init([collections,collections2],options)),它就可以工作并使您的操作更简单。Daniel,您的评论很有道理,我已经确信这可以解决我的问题。我已经修改了我的代码,现在第二个JSONStore只在第一个JSONStore的初始化完成后才被初始化。但问题仍然存在。我知道我也可以一次性完成两个集合的初始化,这可能会解决我的问题。但正如前面所解释的,我宁愿将不同模块的初始化分开。Daniel,我已经测试了您的工作,事实上,如果我一次性初始化集合,这两个问题都会得到解决。但这只是一个解决办法,如果我在两次内初始化集合,它也应该会起作用。好的,让我调查一下,看看是否可以重现这个问题。丹尼尔,我的承诺有问题,你是对的。问题是由于两个init语句同时执行。当我在init语句之间添加超时时,问题就消失了。我将更新我的问题并添加答案。谢谢你的支持。这确实是我犯的一个错误,但我认为这与我的问题无关。在我看来,唯一的影响是警报显示得太快了。我已经用您的评论更新了我的问题,但JSON_STORE_DATA_PROTECTION_KEY_FAILURE异常仍然存在。似乎第一个.then()不应该出现;我想,这个承诺应该用第二个来解决,所以我想这可能只是一个打字错误。
WL.JSONStore.init(collections, options)
.then(function () {
    WL.Logger.debug("init persons ok");
})
.then(function() {
    WL.JSONStore.init(collections2, options)
   .then(function () {
       WL.Logger.debug("init Users ok");
   })
   .fail(function (errorObject) {
       alert(errorObject.toString());
   });
})
.fail(function (errorObject) {
    alert(errorObject.toString());
});