Javascript 使用循环(Phonegap)向sqlite数据库添加行
我创建了一个小Phonegap应用程序,它通过XML从Ajax调用中获取新闻数据。这很好,但我希望将数据存储在数据库表中,以允许脱机阅读新闻 因此,当Ajax回调循环遍历数据时,我用它填充一个全局新闻对象,然后调用一个函数来检查数据是否已经存储在数据库中。如果不是,则应将其插入数据库新闻表中 问题是,在将新闻存储在表中的事务中,似乎我的新闻对象不再存在,因为我收到了以下消息: 未捕获的TypeError:无法读取中未定义的属性“title” 那么,我如何才能确保这项工作?下面是我选择新闻并想检查它是否已经存在的部分的代码:Javascript 使用循环(Phonegap)向sqlite数据库添加行,javascript,android,sqlite,cordova,Javascript,Android,Sqlite,Cordova,我创建了一个小Phonegap应用程序,它通过XML从Ajax调用中获取新闻数据。这很好,但我希望将数据存储在数据库表中,以允许脱机阅读新闻 因此,当Ajax回调循环遍历数据时,我用它填充一个全局新闻对象,然后调用一个函数来检查数据是否已经存储在数据库中。如果不是,则应将其插入数据库新闻表中 问题是,在将新闻存储在表中的事务中,似乎我的新闻对象不再存在,因为我收到了以下消息: 未捕获的TypeError:无法读取中未定义的属性“title” 那么,我如何才能确保这项工作?下面是我选择新闻并想检查
// Check if a news from the internet already exists in the database; If not, insert it
function checkNewsInDB(){
db.transaction(function(tx){
tx.executeSql("SELECT * FROM NEWS", [], checkSuccess, dbErrorCB);
}, dbErrorCB, dbSuccessCB);
}
// Result Callback from the News Check
function checkSuccess(ctx, result){
var len = result.rows.length;
var found = false;
for(var n = 0; n < newsContainer.length; n++){
for(var r = 0; r < len; r++){
if(result.rows.item(r).n_title == newsContainer[n].title
&& result.rows.item(r).n_pubdate == newsContainer[n].pubdate){
found = r;
}
}
if(found == false){
db.transaction(function(tx){
tx.executeSql("INSERT INTO NEWS (n_title, n_link, n_creator, n_pubdate, n_description) VALUES (?,?,?,?,?)", [newsContainer[n].title, newsContainer[n].link, newsContainer[n].creator, newsContainer[n].pubdate, newsContainer[n].description], insertSuccess, dbErrorCB);
}, dbErrorCB, dbSuccessCB);
} else {
found = false;
}
}
}
//检查数据库中是否已经存在来自互联网的新闻;如果没有,请插入
函数checkNewsInDB(){
数据库事务(功能(tx){
tx.executeSql(“从新闻中选择*,[],检查成功,dbErrorCB);
},dbErrorCB,dbSuccessCB);
}
//来自新闻检查的结果回调
功能检查成功(ctx,结果){
var len=result.rows.length;
var=false;
for(var n=0;n
新闻容器中填充了几行数据,我已经检查过了。如果有人能帮助我理解为什么这不起作用,我会非常高兴
提前谢谢
您好
事务是异步的-当executeSql实际运行时,n已经增加到循环的末尾
不要为每个项目创建新的事务,而是尝试在事务函数中移动循环。谢谢您的回答。以下代码适用于所有有相同问题的人:
// Check if a news from the internet already exists in the database; If not, insert it
function checkNewsInDB(){
db.transaction(function(tx){
tx.executeSql("SELECT * FROM NEWS", [], checkSuccess, dbErrorCB);
}, dbErrorCB, dbSuccessCB);
}
// Result Callback from the News Check
function checkSuccess(ctx, result){
var len = result.rows.length;
var found = false;
for(var n = 0; n < newsContainer.length; n++){
for(var r = 0; r < len; r++){
if(result.rows.item(r).n_title == newsContainer[n].title
&& result.rows.item(r).n_pubdate == newsContainer[n].pubdate){
found = r;
}
}
if(found == false){
var title = newsContainer[n].title;
var link = newsContainer[n].link;
var creator = newsContainer[n].creator;
var pubdate = newsContainer[n].pubdate;
var description = newsContainer[n].description;
ctx.executeSql("INSERT INTO NEWS (n_title, n_link, n_creator, n_pubdate, n_description) VALUES (?,?,?,?,?)",
[title, link, creator, pubdate, description], insertSuccess, dbErrorCB);
} else {
found = false;
}
}
}
//检查数据库中是否已经存在来自互联网的新闻;如果没有,请插入
函数checkNewsInDB(){
数据库事务(功能(tx){
tx.executeSql(“从新闻中选择*,[],检查成功,dbErrorCB);
},dbErrorCB,dbSuccessCB);
}
//来自新闻检查的结果回调
功能检查成功(ctx,结果){
var len=result.rows.length;
var=false;
for(var n=0;n
请您发送示例代码好吗,我仍然无法理解