Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Web SQL数据与获取的json进行比较,然后在ID匹配的情况下删除某些对象_Sql_Ajax_Json_Cordova_Web - Fatal编程技术网

如何将Web SQL数据与获取的json进行比较,然后在ID匹配的情况下删除某些对象

如何将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

我正在接触那些对cordova web sql有一定经验的人。如果你能解决这个问题,当这个项目通过github开源时,你会得到一个感谢。我从wordpress获取json,并在phonegap cordova ios应用程序中呈现所有帖子。我已经在index.js中创建了一个名为addRead的函数,它将posts id存储在本地web sql数据库中。这一部分已经解决了,但是当我使用jquery执行ajax请求时,我可以呈现所有的帖子,但是我想过滤掉已经阅读的帖子,那些在我的表中被称为readposts的帖子

为了给您一个透视图,这是addRead函数和my table:

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进行远程调试: