我一直在测试并学习将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,或者是另一个带有可用于指定数据库中记录的信息的参数。
答案 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 ]
});
})