Приложение Android PhoneGap, имеющее проблемы с SQlite и локальным хранилищем на устройствах Samsung Galaxy

52

У меня возникла проблема с приложением 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?

  • 0
    Можете ли вы опубликовать содержимое журнала cat, когда приложение заморожено?
  • 0
    потеряйте точку с запятой в строке обновления, посмотрите, что произойдет. Например ** WHERE ID = "0"; '** до ** WHERE ID = "0"' **
Показать ещё 5 комментариев
Теги:
cordova

4 ответа

1

Попробуйте увеличить размер БД от 20000 до 200000

var db = window.openDatabase( "База данных", "1.0", "Моя база данных", 200000);

1

Я не думаю, что это проблема устройства, он может быть занят. Возможно, вы могли бы попытаться выполнить каждый заказ в базе данных последовательно, используя обратные вызовы:

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(){
      });
  });
1

Я использовал телефонную трубку до версии 2.0 до 3.1 для устройств samsung и htc и никогда не видел такой проблемы. Какую версию вы используете? Старайтесь использовать стабильные версии, а не бета-версии.

Прежде всего, иногда приложения для телефонных разговоров могут иметь проблемы с синхронизацией при запуске. Может быть, эта проблема может быть связана с этим. Вы можете попробовать это просто поместить deviceready в index.html и после deviceready, направьте свою страницу на свою главную страницу. На главной странице выполняются операции с базой данных (например, создание таблиц и вставка).

Во-вторых, вам нужно отслеживать сообщения об ошибках в функции errorCB. функция ошибки получает параметр, и этот параметр включает код ошибки и errormessage. Проверьте их.

И последнее, если вы используете устройство s4 с Android версии 4.4, вы можете отлаживать свои javascript коды с помощью chrome. Отладка - большое преимущество для телефонного разговора. Используйте его.

1

Возможно, вы дважды открываете базу данных. Открывайте его только один раз и выполняйте все транзакции в этом единственном экземпляре. Также убедитесь, что предыдущая транзакция закончилась, прежде чем запускать другую. Вы не должны беспокоиться об этом, но по моему опыту, Cordova (PhoneGap) WebSQL немного похуже.

  • 0
    Возможно, вы захотите использовать плагин Cordova SQLite, чтобы открыть базу данных на «нативной» стороне для лучшей согласованности.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню