Jquery 不确定如果不存在记录如何添加jaydata sqllite
我正在努力完成以下任务。我有一个从远程数据库返回的json数组,我想对它进行迭代,检查本地数据库中是否存在具有对象ID的记录。如果存在,我想更新记录,如果不存在,我想附加记录。代码如下:Jquery 不确定如果不存在记录如何添加jaydata sqllite,jquery,sqlite,jaydata,Jquery,Sqlite,Jaydata,我正在努力完成以下任务。我有一个从远程数据库返回的json数组,我想对它进行迭代,检查本地数据库中是否存在具有对象ID的记录。如果存在,我想更新记录,如果不存在,我想附加记录。代码如下: $.each(data, function(idx, task) { var taskToUpdate = $org.context.Task.attachOrGet({ Id:task.TaskId});
$.each(data, function(idx, task) {
var taskToUpdate = $org.context.Task.attachOrGet({ Id:task.TaskId});
taskToUpdate.TaskType = task.TaskType;
taskToUpdate.StatusId = task.TaskStatusId;
taskToUpdate.TaskStatus = task.TaskStatus;
taskToUpdate.DateScheduled = task.Date;
taskToUpdate.TimeSlot = task.Time;
taskToUpdate.LastUpdated = new Date();
taskToUpdate.TaskName = "Job " + task.TaskId + " " + task.TaskType + " @" + task.AddressOfTask + ", " + task.PropertyPostCode;
taskToUpdate.SpecialInstructions = task.SpecialInstructions;
taskToUpdate.PropertyAddress = task.AddressOfTask;
taskToUpdate.PropertyPostCode = task.PropertyPostCode;
taskToUpdate.PropertyType = task.PropertyType;
taskToUpdate.NumberOfBedrooms = task.NumberOfBedrooms;
taskToUpdate.HasGarage = task.HasGarage;
taskToUpdate.HasOutHouse = task.HasOutHouse;
});
$org.context.saveChanges({
success: function(db) {
that.messages.push("Tasks saved to local device.");
}, error: function(err) {
console.log(err);
that.messages.push("Errors saving tasks: " + err);
navigator.notification.alert("Error saving local tasks to your device!",
function () {
}, "Error", 'OK');
}
});
代码成功执行,但未将任何记录添加到任务表中
我遗漏了什么吗?而不是$。每个都需要一个具有以下算法的递归函数: -检查是否有使用特定ID保存到本地数据库的记录
- 如果有的话
- 附加
- 设置属性
- 如果没有
- 创建一个新的类型化元素实体
- 设置属性
- 将实体添加到集合-c
ontext.Tasks.add(newEntity)
- 完成所有代码后,调用
)将所有更改保留在批处理中。这比在foreach中调用saveChanes()的代码更快、更安全context.saveChanges(
由于异步行为,递归函数是必需的 我使用了这个代码,它似乎有效,但感觉不“正确”。即我检测更新是否已完成的方式,以避免调用context.savechanges()多个。请随时改进我的答案
function downloadTasksFromWeb(viewModel){
$org.context.UserSetting.first().then(function (userSetting) {
viewModel.set("currentUserSettings", userSetting);
backofficeUrl = viewModel.get("currentUserSettings.BackOfficeUrl") + "/api/tasks";
var operatorId = viewModel.get("currentUserSettings.OperatorId");
var rowsToProcess = 0, rowsProcessed = 0;
viewModel.messages.push("Connecting to server.");
showNotificationInfo("Connecting to server.");
jQuery.ajax({
type: "GET",
url: backofficeUrl,
dataType: 'json',
async: false,
username: "user",
password: "pw",
data: {"operatorId": operatorId},
success: function (data) {
viewModel.messages.push("Tasks received, saving to local device.");
showNotificationInfo("Tasks received, saving to local device.");
rowsToProcess = data.length;
$.each(data, function(idx, task) {
var existingTasks = $org.context.Task.filter("Id", "==", task.TaskId).toArray();
existingTasks.then(function(result) {
var taskToUpdate = $org.context.Task.attachOrGet({ Id:task.TaskId});
taskToUpdate.TaskType = task.TaskType;
taskToUpdate.StatusId = task.TaskStatusId;
taskToUpdate.TaskStatus = task.TaskStatus;
taskToUpdate.DateScheduled = task.Date;
taskToUpdate.TimeSlot = task.Time;
taskToUpdate.LastUpdated = new Date();
taskToUpdate.TaskName = "Job " + task.TaskId + " " + task.TaskType + " @" + task.AddressOfTask + ", " + task.PropertyPostCode;
taskToUpdate.SpecialInstructions = task.SpecialInstructions;
taskToUpdate.PropertyAddress = task.AddressOfTask;
taskToUpdate.PropertyPostCode = task.PropertyPostCode;
taskToUpdate.PropertyType = task.PropertyType;
taskToUpdate.NumberOfBedrooms = task.NumberOfBedrooms;
taskToUpdate.HasGarage = task.HasGarage;
taskToUpdate.HasOutHouse = task.HasOutHouse;
if (result.length == 0) {
$org.context.Task.add(taskToUpdate);
}
rowsProcessed++;
if (rowsProcessed == rowsToProcess) {
$org.context.saveChanges({
success: function(db) {
viewModel.messages.push("Tasks saved to local device.");
showNotificationInfo("Tasks saved to local device.");
}, error: function(err) {
console.log(err);
viewModel.messages.push("Errors saving tasks: " + err);
showNotificationError("Errors saving tasks: " + err);
}
});
}
});
});
}
}).fail(function(resultData) {
showNotificationError("There was an error communicating with the server. Please check your settings and try again.");
});
});
}
感谢您的回复,很抱歉我不清楚,数据来自远程服务器,因此保存更改超出了外观范围。然而真正的问题是jaydata中似乎没有一个简单的“if row exists”函数,所以我事先不知道它是新的还是存在的。我是否必须使用简单的filter.count()来检查行是否已经存在?是的,您可以获得use count()或length()context.Tasks.filter('it.Task_ID==140').count(函数(count){console.log(count)});谢谢如果没有行,Count似乎会抛出一个错误,虽然jaydata的人说你可以忽略它,但在控制台日志中看到错误并不好。。。我在下面的回答中采用了这种方法。。。这并不完美,但似乎很管用。。你认为呢?控制台日志中不应该有错误,我只是用WebSQL、IndexedDB、localStore和OData提供程序检查了一下。分享你的代码,我检查一下。Jaydata是基于承诺的,所以你可以很容易地使用Q或jQuery的延迟。