SQLite数据库未创建-PhoneGap

3
我有一个Phonegap(2.1.0)应用程序,在onDeviceready时创建一个数据库,并使用信息填充表格。
在Chrome上本地运行此应用程序(使用Ripple模拟器)可以正常工作。需要时会创建和填充表格。
在将构建的.apk安装到我的Android设备后,我的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

根据这篇文章,我认为可以忽略错误。
但是,我在logcat中也注意到了这个错误:
    sqlite returned: error code = 1, msg = no such table: latest_events, db=/data/data/<project>/databases/webview.db

我还通过adb shell确认DB未被创建:

在这里:/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'));
}

为了加深我的苦恼 - 在我的日志记录中,我确实看到了“存储完好无损”的console.log输出和“开始创建表格”的消息。
我的errorHandler函数没有返回任何内容,而我的successCallBack函数已经触发……但是数据库没有被创建。
感谢您的帮助。
3个回答

0
我将嵌套函数拆分为单个函数,并根据它们的成功或失败进行“链式”连接。实际上,这比我想象的要简单得多。看来应该先好好阅读文档。感谢你的帮助。
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);
}

0

今天这个问题让我浪费了3个小时。我尝试过:

  • 重写复制数据库代码。
  • 从模拟器/设备中删除应用程序
  • 清除模拟器
  • 清理eclipse
  • 更改文件权限
  • 验证一个工作的SQLite数据库文件

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

现在应用程序运行得非常好,即代码没有问题,但是某些地方被Dropbox搞砸了。


0
当您传递 successCallBack("2") 和 successCallBack("1") 时,实际上是直接调用它们,因此您可能会在成功是否已被调用方面得到错误的结果。您应该提供两个单独的成功回调函数,或者内联一些调用 console.log("1") 的函数。

谢谢你的建议,Simon。我已经添加了内联console.log('1'),甚至取消注释了doMessage函数 - 它们都被触发了。但是没有创建数据库。 - DavidP
奇怪,我会尝试简化创建语句,然后从那里开始。 - Simon MacDonald
我已经尽力让它尽可能简单了。会尝试另一个建议并回复。感谢反馈。 - DavidP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接