【问题标题】:SQLITE DB not being created - PhoneGap未创建 SQLITE DB - PhoneGap
【发布时间】:2012-11-13 07:47:17
【问题描述】:

我有一个 Phonegap (2.1.0) 应用程序,它 onDeviceready 创建一个数据库并使用信息填充一个表。

在 Chrome 上本地运行(使用 Ripple 模拟器)可以工作。正在根据需要创建和填充表格。

在我的 Android 设备上安装 build .apk 后,我的 Eclipse logcat 显示:

    sqlite returned: error code = 14, msg = cannot open file at line 27712 of [8609a15dfa], db=/data/data/<project>/databases/webview.db

    sqlite returned: error code = 14, msg = os_unix.c: open() at line 27712 - "" errno=2 path=/CachedGeoposition.db, db=/data/data/<project>/databases/webview.db

根据这篇文章here,我认为可以忽略。

但是 - 我在 logcat 中也注意到了这个错误:

    sqlite returned: error code = 1, msg = no such table: latest_events, db=/data/data/<project>/databases/webview.db

我还 - 通过 adb shell - 确认未创建数据库: 这里:/data/data/com.application/databases。 或在这里:/data/data/com.application/app_databases

所以 - 我的代码:

 if (!window.openDatabase) {
        doMessage('Databases are not supported on this device. Sorry','error');
        return;
    }else{
        consoleLog('all good for storage');
        var db;
        var shortName = 'MyDB';
        var version = '1.0';
        var displayName = 'MyDB';
        var maxSize = 102400;

        function errorHandler(transaction, error) {consoleLog('Error: ' + error.message + ' code: ' + error.code);}

        function nullHandler(){};
        db = window.openDatabase(shortName, version, displayName,maxSize);


            consoleLog('starting table creation');
            db.transaction(function(tx){
                tx.executeSql( 'CREATE TABLE IF NOT EXISTS latest_events (id integer PRIMARY KEY AUTOINCREMENT,EventID integer,EventLocation text,EventName text,EventDateFrom varchar,EventTime timestamp,EventPresentedBy varchar,EventVenue varchar,EventScript text,RequireRSVP varchar)',[],nullHandler,errorHandler);
                db.transaction(function(tx){
                    tx.executeSql('SELECT count(id) as RowCount FROM device_info ', [],
                        function(tx, result) {
                            if (result != null && result.rows != null) {
                                for (var i = 0; i < result.rows.length; i++) {
                                    var row = result.rows.item(i);
                                    consoleLog('rowcount: '+row.RowCount);
                                    if(row.RowCount==0){
                                        tx.executeSql('INSERT INTO device_info (device_name, device_platform, device_uuid, device_os_ver, date_last_used) VALUES (?,?,?,?,?)',[device.name, device.platform, device.uuid, device.version, window.bowman_config.siteDate],nullHandler,errorHandler);
                                        //doMessage('device info row added','notice');
                                    }
                                }
                            }
                        },errorHandler);
                },errorHandler,successCallBack('2'));
                //doMessage('device info row added','notice');
            },errorHandler,successCallBack('1'));
}

更糟糕的是 - 在我的 logcat 上,我确实看到了 console.log 输出“一切都适合存储”,以及“开始创建表”消息。

我的 errorHandler 函数没有返回任何内容,并且我的 successCallBack 函数被触发...但没有创建数据库。

感谢您的帮助。

【问题讨论】:

    标签: javascript android sqlite cordova


    【解决方案1】:

    当您传入 successCallBack("2") 和 successCallBack("1") 时,您实际上是在直接调用它们,因此您可能会误报是否实际调用了 success。您应该提供两个单独的成功回调,或者只是内联一些调用 console.log("1") 的函数。

    【讨论】:

    • 感谢西蒙的建议。我添加了内联 console.log('1') 甚至取消了 doMessage 函数的注释——它们触发了。但没有创建数据库。
    • 很奇怪,我会尝试简化 create 语句并从那里获取它。
    • 老实说,我尽可能简单地尝试了它。将尝试另一个建议并恢复。感谢您的反馈。
    【解决方案2】:

    今天这个问题花了我 3 个小时。我尝试了什么:

    • 重写复制数据库代码。
    • 从模拟器/设备中删除应用程序
    • 擦除模拟器
    • 清洁日食
    • 更改文件权限
    • 验证有效的 SQLite 数据库文件

    我通过将代码从共享 Dropbox 帐户复制到另一个位置并使用另一个包名称重构 Android Manifest 和 java 文件中的代码来解决了这个问题。

    应用程序现在运行良好,即代码没有任何问题,但在某个地方它被 Dropbox 混合了。

    【讨论】:

      【解决方案3】:

      我将嵌套函数分解为单个函数,并根据它们的成功或失败“链接”它们。它实际上比我想象的要简单得多。似乎是 RTFM。感谢大家的帮助。

      简化:

      var db = window.openDatabase("TheApp", "1.0", "The App", 50000000);
      db.transaction(queryDB, errorCB, successCB);
      
      // Query the database   //
      function queryDB(tx) {
          //tx.executeSql('SELECT * FROM table", [], querySuccess, errorCB);
      }
      
      function querySuccess(tx, results) {
          //do more functions here
      }
      
      function errorCB(err) {
          console.log("Error processing SQL: "+err.code);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-03
        • 2011-06-09
        • 2012-12-21
        • 1970-01-01
        • 2013-01-28
        • 2021-05-01
        • 2010-12-26
        相关资源
        最近更新 更多