Android phonegap 应用程序在三星 Galaxy 设备上存在 SQlite 和本地存储问题

Posted

技术标签:

【中文标题】Android phonegap 应用程序在三星 Galaxy 设备上存在 SQlite 和本地存储问题【英文标题】:Android phonegap application having issues with SQlite and local storage on Samsung Galaxy devices 【发布时间】:2013-12-02 06:38:22 【问题描述】:

我遇到了针对 androidios 构建的 PhoneGap 应用程序的问题。在 iOS 和大多数 Android 设备上,它运行良好,但三星 Galaxy S3 和 S4 除外。

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

我在三星设备上遇到的问题是数据库在应用程序第一次运行时无法正确加载,但是如果用户完全关闭应用程序并重新打开它,则数据库创建时不会出现错误。因为第一页要求用户输入他们的年龄,然后将值存储在 SQL 数据库中,所以用户会得到应用程序此时已冻结的印象。

数据库初始化代码:

index.html

document.addEventListener("deviceready", onDeviceReady, false);

function onDeviceReady() 
    populateDB(); 

ma​​in_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是否与它有关?

【问题讨论】:

app卡住的时候能贴一下日志猫的内容吗? 从更新行中松开分号,看看会发生什么。像 ** WHERE ID="0";'** 到 ** WHERE ID="0"'** 需要进行一些调试来解决这个问题,因为根据提供的代码无法找到与这些设备相关的任何具体问题。请在这些设备上尝试尝试捕获错误原因警报,以查看是否第一次出现错误。此外,如果没有提出任何问题,请考虑检查您的执行位置。例如检查age_query是否被执行,是否是executeSql调用成功回调。 你说index.html 但那里没有HTML? @nyuszika7h:我想他的意思是他的 deviceready 在那里。对于这个问题,HTML 不应该那么重要。 【参考方案1】:

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

【讨论】:

您可能需要考虑使用 Cordova SQLite 插件,以便在“本机”端打开数据库以获得更好的一致性。【参考方案2】:

我在三星和 htc 设备上使用 phonegap 直到 2.0 版本到 3.1 版本,但从未见过这样的问题。您使用的是哪个版本?尝试使用稳定版本,而不是测试版。

首先,有时 phonegap 应用程序在启动时可能会出现同步问题。也许这个问题可能与此有关。您可以尝试将 deviceready 放在 index.html 中,然后在 deviceready 之后,将您的页面定向到您的主页。在主页中执行您的数据库操作(如创建表和插入)。

其次,您需要在 errorCB 函数上跟踪错误消息。错误函数获取一个参数,该参数包括错误代码和错误消息。看看这些。

最后,如果您使用 s4 设备和 android 版本 4.4,您可以使用 chrome 调试您的 javascript 代码。调试是 phonegap 的一大优势。使用它。

【讨论】:

【参考方案3】:

我认为这不是设备的问题,它可能正忙。也许您可以尝试使用回调按顺序执行每个订单到数据库:

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

【讨论】:

【参考方案4】:

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

var db = window.openDatabase("数据库", "1.0", "我的数据库", 200000);

【讨论】:

以上是关于Android phonegap 应用程序在三星 Galaxy 设备上存在 SQlite 和本地存储问题的主要内容,如果未能解决你的问题,请参考以下文章

Android(至少在三星上)现在正在对所有应用程序进行分组,而无需更改应用程序代码或有效负载

在android中使用phonegap时,从画廊拍摄的图像以不同的方向显示

是否可以在 iPhone 上的 phonegap 应用程序中在后台跟踪 gps 位置?

停止在三星设备上的科尔多瓦 webview 中无休止地缓冲 html5 视频

无法连接到 websocket

Sencha Touch App 在多点触控/Android 时冻结