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.
- Implementación SQLite deficiente? Acceso a los datos por primera vez demasiado lento
- Compruebe si un registro existe o no, si existe, actualícelo y cree otro en PhoneGap?
- Cómo buscar una fila usando id sqlite?
- Instrucciones de inserción múltiple android sqlite
- Cómo utilizar una base de datos existente con una aplicación de Android
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?
- SQLite static openDatabase error de método de base de datos en Android
- Acceso a una base de datos .sqlite descargada determinada en el almacenamiento externo desde una aplicación de Android
- GreenDAO - clave primaria en varias columnas
- Consulta SQLite SQLiteLog (1) no such Column:
- Comprobación de consultas de Sqlite - menor y mayor que
- Android: ¿Cómo acceder a los resultados de Cursor cuando INNER JOIN se realiza?
- Sincronizar SQLite con un servidor de bases de datos SQL externo
- Sincronizar datos SQLite desde el teléfono Android a la base de datos MySQL de MySQL de Windows
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);