Android手机应用程序在Samsung Galaxy设备上存在SQlite和本地存储问题

我正在为Android和iOS构build的PhoneGap应用程序出现问题。 在iOS和大多数Android设备上,除三星Galaxy S3和S4外,其function都非常完美。

在首页加载时,应用程序创build一个本地SQL数据库。 该数据库用于存储整个应用程序中的问题和答案的值。

我在三星设备上遇到的问题是数据库在第一次运行应用程序时无法正常加载,但是如果用户完全closures应用程序并重新打开该应用程序,则会创build数据库而不会出错。 由于第一页需要用户input其年龄,然后将该值存储在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之后,没有任何事情发生,数据库也不更新结果。

这只是三星Galaxy S3和S4的一个问题,我想知道三星的WebKit是否与它有关?

这可能是因为你打开数据库两次。 只打开一次,然后在单个实例上完成所有的交易。 在开始另一个之前,还要确保你以前的事务已经完成。 你不应该担心,但根据我的经验cordova(PhoneGap)的WebSQL是有点挑剔。

我使用phonegap直到2.0版本到3.1三星和HTC设备,从来没有见过这样的问题。 你正在使用哪个版本? 尝试使用稳定的版本,而不是testing版。

首先,有时phonegap应用程序可能在启动时有同步问题。 也许这个问题可能与此有关。 你可以尝试一下,把deviceready放在index.html中,在deviceready之后,把你的页面定向到主页面。 在主页面上进行数据库操作(如创build表格和插入)。

其次,你需要跟踪errorCB函数的错误信息。 错误函数获取参数,该参数包含错误代码和错误消息。 检查出来。

最后,如果你正在使用android版本4.4的s4设备,你可以使用chromedebugging你的javascript代码。 debugging对手机来说是一个很大的优势。 用它。

我不认为这是一个设备的问题,它可能是忙碌的。 也许你可以尝试执行每个订单数据库sequentally,使用callback:

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

尝试将数据库大小从20000增加到200000

var db = window.openDatabase(“Database”,“1.0”,“My Database”,200000);