JSONStore +适配器推送替换 - 如何将_id作为参数?

时间:2015-09-08 12:02:20

标签: ibm-mobilefirst jsonstore

我一直在测试并学习将JSONStore与MobileFirst SQL Adapter结合使用。一切都很好,但我找不到下一个障碍的解决方案。

当我通过替换编辑JSONStore集合中的项目时,它在本地工作正常。当我推送集合时,它正确地到达适配器。问题是我无法告诉数据库要更新哪条记录。这样它只是将所有记录更新为给定的信息。

入选的集合:

caller.open = function(){
WL.JSONStore.destroy();

var collections = {
    people: {
        searchFields: {
            name: 'string',
            age: 'integer'},
        //-- Start adapter metadata
        adapter : {
            name: 'test',
            add: 'addTest',
            remove: 'deleteTest',
            replace: 'updateTest',
            load: {
                procedure: 'getTests',
                params: [],
                key: 'peopleList'
            }
        }
        //-- End adapter metadata
        }
    };

    //Initialize
    WL.JSONStore.init(collections)
        .then(function () {
            WL.Logger.debug("succes open");
            caller.sync();
            //handle success
        })
        .fail(function (errorObject) {
            WL.Logger.debug("failed open");
            //handle failure
        });
}

调用的编辑方法(使用pushrequest和push进行测试):

caller.edit = function(){
var document = {_id: 3, json: {name: 'joopy', age: 666}};
var collectionName = 'people';
var options = {}; //default
WL.JSONStore.get(collectionName)
    .replace(document, options)
    .then(function () {
        //handle success
        WL.JSONStore.get(collectionName).getPushRequired()
        .then(function (results) {
            WL.Logger.debug(results);
            WL.JSONStore.get(collectionName).push()
            .then(function (res) {
            //handle success
            //res is an empty array if all documents reached the server
                //res is an array of error responses if some documents failed to reach the server
            })
            .fail(function (errorObject) {
            //handle failure
            });
        //handle success
        })
        .fail(function (errorObject) {
        //handle failure
        });
    })
    .fail(function (errorObject) {
        //handle failure
    });
}

以下是正确调用的适配器方法,但它需要一种方法来指定数据库中的某个记录。

function updateTest(data) {

//WL.Logger.error('Got data from JSONStore to REPLACE: ' + data);

var object = JSON.parse(data);  

return WL.Server.invokeSQLStatement({
    preparedStatement : updateStatement,
    parameters : [object.name, object.age]
});
}

使用当前注释的WL.Logger.error显示以下信息:

[错误]从JSONStore获取数据到REPLACE:{“name”:“joopy”,“age”:666} [project MyFirstApp]

我需要的是,数据既可以给我旧数据也可以给出_id,或者是另一个带有可用于指定数据库中记录的信息的参数。

1 个答案:

答案 0 :(得分:2)

阅读文档的Working with external data部分。基本上,您可以这样做而不是WL.JSONStore.get(collectionName).push()

var accessor = WL.JSONStore.get('people');

accessor.getAllDirty()

.then(function (dirtyDocs) {
  // ...
});

dirtyDocs参数类似于以下示例:

[{_id: 1,
  json: {id: 1, ssn: '111-22-3333', name: 'Carlos'},
  _operation: 'add',
  _dirty: '1395774961,12902'}]
  

我需要的是,数据既可以给我旧数据也可以给出_id,或者是另一个带有可用于指定数据库中记录的信息的参数。

您将拥有_id,然后就可以:

.then(function (dirtyDocs) {

  return WL.Client.invokeProcedure({
    adapter : 'people',
    procedure : 'updatePeople',
    parameters : [ dirtyDocs ]
  });
})