Aplicación Android phonegap que tiene problemas con SQlite y almacenamiento local en dispositivos Samsung Galaxy

Tengo un problema con una aplicación PhoneGap que se ha creado para Android e iOS. En iOS y en la mayoría de los dispositivos Android, funciona perfectamente, excepto para Samsung Galaxy S3 y S4.

En la carga de la primera página, la aplicación crea una base de datos SQL local. Esta base de datos se utiliza para almacenar valores de preguntas y respuestas en toda la aplicación.

El problema que tengo en los dispositivos Samsung es que la base de datos no se cargará correctamente la primera vez que se ejecute la aplicación. Sin embargo, si un usuario cierra la aplicación completamente y la vuelve a abrir, la base de datos se crea sin errores. Debido a que la primera página requiere que un usuario introduzca su edad y, a continuación, almacena el valor en una base de datos SQL, los usuarios tienen la impresión de que la aplicación se ha congelado en este momento.

Código de inicialización para la base de datos:

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

Después de age_button_pressed , no hay nada que suceda y la base de datos no actualiza el resultado.

Es sólo un problema en el Samsung Galaxy S3 y S4, y me pregunto si el WebKit de Samsung tiene algo que ver con él?

Puede ser porque está abriendo la base de datos dos veces. Sólo abrir una vez y hacer todas las transacciones en esa instancia única. También asegúrese de que su transacción anterior haya terminado antes de comenzar otra. Usted no debería tener que preocuparse por eso, pero en mi experiencia Cordova (PhoneGap) WebSQL es un poco melindroso.

He utilizado phonegap hasta la versión 2.0 a 3.1 para samsung y htc dispositivos y nunca visto tal problema. ¿Qué versión está utilizando? Trate de usar versiones estables, no beta.

En primer lugar, a veces las aplicaciones phonegap pueden tener problemas de sincronización en el inicio. Tal vez ese tema pueda estar relacionado con eso. Usted puede intentar que acaba de poner deviceready en index.html y después deviceready, dirigir su página a su página principal. En la página principal haga sus operaciones de base de datos (como crear tablas e insertar).

En segundo lugar, es necesario rastrear mensajes de error en la función errorCB. Función de error obtiene un parámetro y ese parámetro incluye errorcode y errormessage. Compruebe éstos hacia fuera.

Y por último, si está utilizando el dispositivo s4 con Android versión 4.4, puede depurar sus códigos javascript con cromo. La depuración es una gran ventaja para phonegap. Utilícelo.

No creo que esto era un problema del dispositivo, podría estar ocupado. Tal vez usted podría tratar de ejecutar cada pedido a la base de datos secuencialmente, utilizando las devoluciones de llamada:

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

Intentar aumentar el tamaño de DB de 20000 a 200000

Var db = window.openDatabase ("Base de datos", "1.0", "Mi base de datos", 200000);

  • Obtención de todos los registros de sqlite android
  • ¿Cuál es el método más rápido para realizar más de 64 combinaciones de tablas en SQlite?
  • La concurrencia de webview de Android causó SQLiteException: la base de datos está bloqueada
  • Actualización de versiones de base de datos sqlite?
  • Cómo buscar una fila usando id sqlite?
  • Cómo lograr lo siguiente en Realm para android
  • Obtener actualizaciones de contar las filas de SQLite en Android mediante una consulta en bruto?
  • Almacenar valores dobles en SQLite: ¿cómo asegurar la precisión?
  • Cómo almacenar la base de datos SQLite de Android en sdcard
  • SQLite de Android Cursor fuera de límites de excepción en SELECT count (*) FROM table
  • Creación de tablas en la base de datos sqlite en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.