如何将Web SQL数据与获取的json进行比较,然后在ID匹配的情况下删除某些对象
我正在接触那些对cordova web sql有一定经验的人。如果你能解决这个问题,当这个项目通过github开源时,你会得到一个感谢。我从wordpress获取json,并在phonegap cordova ios应用程序中呈现所有帖子。我已经在index.js中创建了一个名为addRead的函数,它将posts id存储在本地web sql数据库中。这一部分已经解决了,但是当我使用jquery执行ajax请求时,我可以呈现所有的帖子,但是我想过滤掉已经阅读的帖子,那些在我的表中被称为readposts的帖子 为了给您一个透视图,这是addRead函数和my table:如何将Web SQL数据与获取的json进行比较,然后在ID匹配的情况下删除某些对象,sql,ajax,json,cordova,web,Sql,Ajax,Json,Cordova,Web,我正在接触那些对cordova web sql有一定经验的人。如果你能解决这个问题,当这个项目通过github开源时,你会得到一个感谢。我从wordpress获取json,并在phonegap cordova ios应用程序中呈现所有帖子。我已经在index.js中创建了一个名为addRead的函数,它将posts id存储在本地web sql数据库中。这一部分已经解决了,但是当我使用jquery执行ajax请求时,我可以呈现所有的帖子,但是我想过滤掉已经阅读的帖子,那些在我的表中被称为read
createTable: function () {
app.db.transaction(function (tx) {
tx.executeSql("CREATE TABLE IF NOT EXISTS readposts(ID INTEGER PRIMARY KEY ASC, postid INTEGER, added_on TEXT)", [],
app.onSuccess, app.onError);
});
},
addRead: function (postid) {
app.db.transaction(function (tx) {
var ts = new Date().toUTCString();
tx.executeSql("INSERT INTO readposts(postid, added_on) VALUES (?,?)", [postid, ts], app.onSuccess, app.onError);
});
}
我从这里获取json,您不必查看所有内容,只需找出帖子和ID的位置:
在ajax请求成功函数中,我遍历readposts表,在这个循环中遍历获取的json。在if语句中,我将表中的posted与获取的json的id进行比较。如果它们匹配,我想从json中删除这篇文章
在我看来,我的代码似乎是合乎逻辑的,所有的循环都可以工作,但是程序忽略了我的if语句,并且仍然呈现所有的post,即使表的postid:s与从获取的json中获取的id:s匹配。这是ajax get请求中的success函数内部的外观。我已经注释掉了渲染代码,因为它不相关:
success: function(data){
app.db.transaction(function (tx) {
tx.executeSql("SELECT * FROM readposts ORDER BY ID DESC", [], function (tx, rs) {
var row;
for (var i = 0; i < rs.rows.length; i++) { // loop through web sql db
row = rs.rows.item(i);
$.each(data.posts, function(index, obj) { // loop through fetched json
if(parseInt(row.postid) == parseInt(obj.id)) // make sure both values are integers {
delete obj;
}
});
}
}, app.onError);
});
// This is the render code, ignore it
/*
var source = $("#blog-template").html();
var template = Handlebars.compile(source);
var blogData = template(data);
$('#blog-data').html(blogData);
$('#blog-data').trigger('create');
dfd.resolve(data);
$(".nav1 li a").removeClass('active-menu');
$('#btn-senaste').addClass("active-menu");
$('#recommended-data').html('<p></p>');
*/
},
这两个循环都可以工作,但是我尝试删除帖子的if语句被忽略。我相信这是一段需要修正的代码
感谢您的帮助我怀疑您的if语句可能是正确的,但delete语句没有效果。 不能删除jQuery的$传递的值对象。每个函数;您需要在其父对象的上下文中删除它-请参见 因此,请尝试以下方法:
$.each(data.posts, function(index, obj) { // loop through fetched json
if(parseInt(row.postid) == parseInt(obj.id)) // make sure both values are integers {
delete data.posts[index];
}
});
我建议使用逐步调试程序在您怀疑的行上放置断点;这样,您可以检查变量的值并确定发生了什么。
根据您测试的平台,如果是Android 4.4+,可以使用iOS 6+,或者Ripple emulator,然后是普通的Chrome开发工具
希望这能有所帮助:-同样,我使用了警报,if语句中的警报发出了。我的下一步是尝试在应用程序中将json呈现为字符串,并查看choosen帖子是否已被删除。如果这样做有效,那么帖子的呈现肯定有问题。也许在json被操作之前,一切都会呈现出来
app.db.transaction(function (tx) {
tx.executeSql("SELECT * FROM readposts ORDER BY ID DESC", [], function (tx, rs) {
var row;
for (var i = 0; i < rs.rows.length; i++) { // loop through web sql db
row = rs.rows.item(i);
alert("db postid: "+row.postid);
$.each(data.posts, function(index, obj) { // loop through fetched json
alert("index: "+index+", obj.id: "+obj.id);
if(parseInt(row.postid) === parseInt(obj.id)) {
alert("match! delete postid="+row.postid+",obj,id"+obj.id );
delete data.posts[index];
}
});
}
}, app.onError);
});
谢谢你的回答,不幸的是这不起作用。我发现if语句是通过在函数中使用警报发出的。我认为我不能使用safaris调试器,因为我认为web sql数据库只适用于ondeviceready。请看我下一篇评论中的代码:您完全可以使用Safari的调试器调试带有WebSQL数据库的cordova应用程序——我已经做过很多次了。你可以一步一步地浏览JS,只是不能像使用Chrome那样直接检查DB。如果不查看整个源代码,就很难看到问题所在。如果If语句的计算结果为true,并且delete仍然不起作用,那么可能是data.posts的范围有问题。尝试在删除后将其转储到控制台,即console.dirdata.postst此说明如何设置iOS以便使用safari进行远程调试: