iOS上的Worklight 6.2 JSONStore问题

时间:2014-07-17 15:04:52

标签: 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>
<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和移动浏览器模拟器上按预期工作。

2 个答案:

答案 0 :(得分:2)

正如Daniel所建议的那样,问题是两种方法都在同时执行。这会导致奇怪的行为。解决方案是在第一个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());
});

答案 1 :(得分:1)

我想我知道问题是什么;你在destroy()调用之后显示一个警告,并认为看到警报意味着毁灭已经完成,但事实并非如此; destroy()也是一个异步API调用,所以像init一样,你必须使用promises / callback来做警报。例如:

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