У меня возникла проблема с приложением PhoneGap, которое было создано как для Android, так и для iOS. На iOS и большинстве Android-устройств он отлично работает, за исключением Samsung Galaxy S3 и S4.
При загрузке первой страницы приложение создает локальную базу данных SQL. Эта база данных используется для хранения значений из вопросов и ответов в приложении.
Проблема, которую я испытываю на устройствах Samsung, заключается в том, что при первом запуске приложения база данных не будет загружаться должным образом, однако если пользователь полностью закрывает приложение и снова открывает его, база данных создается без ошибок. Поскольку на первой странице требуется, чтобы пользователь ввел свой возраст, а затем сохранил значение в базе данных SQL, пользователи получают впечатление, что приложение заморозилось на этом этапе.
Код инициализации базы данных:
index.html
document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
populateDB();
}
main_js.js
function populateDB() {
var db = window.openDatabase("Database", "1.0", "My Database", 20000);
db.transaction(populate_DB, errorCB, successCB);
}
function populate_DB(tx) {
tx.executeSql('CREATE TABLE IF NOT EXISTS Options (ID INTEGER UNIQUE NOT NULL, Name TEXT NOT NULL, Value INTEGER NOT NULL)');
tx.executeSql('CREATE TABLE IF NOT EXISTS Questions (ID INTEGER UNIQUE NOT NULL, Question TEXT NOT NULL, Answer TEXT)');
tx.executeSql('INSERT OR IGNORE INTO Options (ID, Name, Value) VALUES (1, "License", 0)');
tx.executeSql('INSERT OR IGNORE INTO Questions (ID, Question, Answer) VALUES (0, "Age","")');
tx.executeSql('INSERT OR IGNORE INTO Questions (ID, Question, Answer) VALUES (1, "two","")');
tx.executeSql('INSERT OR IGNORE INTO Questions (ID, Question, Answer) VALUES (2, "three","")');
tx.executeSql('INSERT OR IGNORE INTO Questions (ID, Question, Answer) VALUES (3, "four","")');
tx.executeSql('INSERT OR IGNORE INTO Questions (ID, Question, Answer) VALUES (4, "five","")');
tx.executeSql('INSERT OR IGNORE INTO Questions (ID, Question, Answer) VALUES (5, "six","")');
tx.executeSql('INSERT OR IGNORE INTO Questions (ID, Question, Answer) VALUES (6, "seven","")');
tx.executeSql('INSERT OR IGNORE INTO Questions (ID, Question, Answer) VALUES (7, "eigth","")');
tx.executeSql('INSERT OR IGNORE INTO Questions (ID, Question, Answer) VALUES (8, "nine","")');
tx.executeSql('INSERT OR IGNORE INTO Questions (ID, Question, Answer) VALUES (9, "ten","")');
tx.executeSql('INSERT OR IGNORE INTO Questions (ID, Question, Answer) VALUES (10, "eleven","")');
tx.executeSql('INSERT OR IGNORE INTO Questions (ID, Question, Answer) VALUES (11, "twelve","")');
tx.executeSql('INSERT OR IGNORE INTO Questions (ID, Question, Answer) VALUES (12, "thirteen","")');
tx.executeSql('INSERT OR IGNORE INTO Questions (ID, Question, Answer) VALUES (13, "fourteen","")');
tx.executeSql('INSERT OR IGNORE INTO Questions (ID, Question, Answer) VALUES (14, "fifteen","")');
tx.executeSql('INSERT OR IGNORE INTO Questions (ID, Question, Answer) VALUES (15, "sixteen","")');
tx.executeSql('INSERT OR IGNORE INTO Questions (ID, Question, Answer) VALUES (16, "seventeen","")');
}
age_button_pressed
function age_save() {
var db = window.openDatabase("Database", "1.0", "My Database", 20000);
loc = "q_sex.html";
db.transaction(age_query, errorCB);
}
function age_query(tx) {
var age = document.getElementById("a_age").value;
tx.executeSql('UPDATE Questions SET Answer = "' + age + '" WHERE ID="0";', [], q_querySuccess, errorCB);
}
После age_button_pressed
ничего не происходит, и база данных не обновляет результат.
Это только проблема на Samsung Galaxy S3 и S4, и мне интересно, что с этим связано Samsung WebKit?
Попробуйте увеличить размер БД от 20000 до 200000
var db = window.openDatabase( "База данных", "1.0", "Моя база данных", 200000);
Я не думаю, что это проблема устройства, он может быть занят. Возможно, вы могли бы попытаться выполнить каждый заказ в базе данных последовательно, используя обратные вызовы:
BBDDD.transaction(
function(tx){
tx.executeSql("CREATE TABLE IF NOT EXISTS DateSession (\n\
id INTEGER PRIMARY KEY AUTOINCREMENT,\n\
field1 TEXT NOT NULL,\n\
field2 TEXT NOT NULL)");
},
function(err){
console.log("Error"+err.code);
},
function(){
BBDDD.transaction(function(tx){
tx.executeSql("CREATE TABLE IF NOT EXISTS Table2 (\n\
id INTEGER PRIMARY KEY AUTOINCREMENT,\n\
field1 TEXT NOT NULL,\n\
field2 TEXT NOT NULL)");
},
function(err){
console.log("Error"+err.code);
},
function(){
});
});
Я использовал телефонную трубку до версии 2.0 до 3.1 для устройств samsung и htc и никогда не видел такой проблемы. Какую версию вы используете? Старайтесь использовать стабильные версии, а не бета-версии.
Прежде всего, иногда приложения для телефонных разговоров могут иметь проблемы с синхронизацией при запуске. Может быть, эта проблема может быть связана с этим. Вы можете попробовать это просто поместить deviceready в index.html и после deviceready, направьте свою страницу на свою главную страницу. На главной странице выполняются операции с базой данных (например, создание таблиц и вставка).
Во-вторых, вам нужно отслеживать сообщения об ошибках в функции errorCB. функция ошибки получает параметр, и этот параметр включает код ошибки и errormessage. Проверьте их.
И последнее, если вы используете устройство s4 с Android версии 4.4, вы можете отлаживать свои javascript коды с помощью chrome. Отладка - большое преимущество для телефонного разговора. Используйте его.
Возможно, вы дважды открываете базу данных. Открывайте его только один раз и выполняйте все транзакции в этом единственном экземпляре. Также убедитесь, что предыдущая транзакция закончилась, прежде чем запускать другую. Вы не должны беспокоиться об этом, но по моему опыту, Cordova (PhoneGap) WebSQL немного похуже.