Добавление строк в базу данных sqlite с использованием цикла (Phonegap)

Я создал небольшое приложение Phonegap, которое получает данные из вызова Ajax через XML. Это отлично работает, но я хотел бы сохранить данные в таблице базы данных, чтобы также разрешить автономное чтение новостей.

Поэтому, когда обратный вызов Ajax проходит через данные, я заполняю его глобальным новостным объектом, а затем вызываю функцию, чтобы проверить, сохранены ли данные в базе данных. Если нет, его следует вставить в таблицу новостей базы данных.

Проблема в том, что в транзакции для хранения новостей в таблице мне кажется, что у меня больше нет объекта новостей, потому что я получаю сообщение:

Uncaught 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; } } } 

NewsContainer IS заполнен несколькими строками данных, я это проверил. Я был бы очень рад, если бы кто-нибудь мог помочь мне понять, почему это не работает.

Заранее спасибо!

Приветствую,

Бернд

Db.transaction является асинхронным – к тому времени, когда выполняется 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; } } } 
Intereting Posts