tutorial example español javascript android sql sqlite cordova

javascript - example - Aplicación Android Phonegap con problemas con SQlite y almacenamiento local en dispositivos Samsung Galaxy



cordova sqlite example (4)

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

En la primera carga de la página, la aplicación crea una base de datos SQL local. Esta base de datos se usa 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 ejecuta la aplicación, sin embargo, si un usuario cierra la aplicación por completo y la vuelve a abrir, la base de datos se crea sin errores. Como la primera página requiere que el usuario ingrese su edad y luego almacena el valor en una base de datos SQL, los usuarios obtienen 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 ocurre nada y la base de datos no actualiza el resultado.

Es solo un problema en el Samsung Galaxy S3 y S4, y me pregunto si el WebKit de Samsung tiene algo que ver con eso.


Intente aumentar el tamaño de la base de datos de 20000 a 200000

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


No creo que esto sea un problema del dispositivo, podría estar ocupado. Tal vez podrías intentar ejecutar cada orden en la base de datos secuencialmente, usando 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(){ }); });


Puede ser porque estás abriendo la base de datos dos veces. Solo ábrelo una vez y haz todas tus transacciones en esa única instancia. También asegúrese de que su transacción anterior haya terminado antes de comenzar otra. No debería tener que preocuparse por eso, pero en mi experiencia, el WebSQL de Cordova (PhoneGap) es un poco quisquilloso.


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

En primer lugar, a veces las aplicaciones de phonegap pueden tener problemas de sincronización al inicio. Tal vez ese problema puede estar relacionado con eso. Puedes probar que solo pongas el dispositivo listo en index.html y después de que el dispositivo esté listo, diriges tu página a tu página principal. En la página principal, realice las operaciones de su base de datos (como crear tablas e insertar).

En segundo lugar, debe rastrear los mensajes de error en la función errorCB. la función de error obtiene un parámetro y ese parámetro incluye el código de error y el mensaje de error. Mira esto.

Y, por último, si está utilizando el dispositivo s4 con la versión de Android 4.4, puede depurar sus códigos de JavaScript con chrome. La depuración es una gran ventaja para phonegap. Úselo.