2

我正在使用 PhoneGap (Cordova 2.2.0) 开发一个 Android 应用程序 (Android 4.1.2)。

我正在使用Cordova 存储 API

我正在关注互联网上的不同示例,以了解如何在 Android 上操作数据库,例如使用 Phonegap + Jquery mobile 使用 SQLite 创建 Android 应用程序

事实上,我的问题是我不确定数据库是否是在真实设备上物理创建的(我正在运行 Android 2.3 的真实设备上进行测试):

  • 我使用文件资源管理器签入文件夹 /data/ 但它已折叠并且无法展开(可能是一些系统管理员问题?!如果是这种情况,我怎样才能成为 root?)
  • 我直接在手机上查了下,竟然连Application目录都没有找到!(正常吗?)

=> 所以我不确定是否创建了数据库。

为什么我认为没有创建数据库?

事实上,每次我启动我的应用程序时,表都是空的,尽管我之前已经填充了它。

我在 LogCat 中也有这个错误:

sqlite returned error code = 14 msg = cannot open file at source line 25467

我做了一些研究,发现 onCreate 函数中的这段代码可以解决这个问题:

    WebSettings settings = super.appView.getSettings(); 
    settings.setJavaScriptEnabled(true); 
    settings.setDatabaseEnabled(true); 
    String databasePath = this.getApplicationContext().getDir("database", 
                           Context.MODE_PRIVATE).getPath(); 
    settings.setDatabasePath(databasePath); 

但它并没有解决它。

我的代码很简单,我阅读了一个二维码并将其保存在一个表格中,其中包含以下位置:

var scanCode = function() {
    window.plugins.barcodeScanner.scan(
        function(result) {  
        alert("Scanned Code: " + result.text 
                + ". Format: " + result.format
                + ". Cancelled: " + result.cancelled);
        getPosition(result.text);
    }, function(error) {
        alert("Scan failed: " + error);
    });
}

function getPosition(data) {
    navigator.geolocation.getCurrentPosition(
            function(position, result){
                launchDB();
                latitude = position.coords.latitude;
                longitude = position.coords.longitude;
                db.transaction(function(tx) {
                    tx.executeSql("insert into DEMO(code,updated, latitude, longitude) values(?,?,?,?)",[data, new Date(),latitude, longitude]);
                },errorCB,successInsert);
            }, positionError);
}

function launchDB() {
    console.log("launchDB()");
    db = window.openDatabase("Database", "1.0", "PhoneGap Demo", 200000);
    db.transaction(setupDB, errorCB);
}

function setupDB(tx) {
    console.log("setupDB()");
    tx.executeSql('DROP TABLE IF EXISTS DEMO');
    tx.executeSql("CREATE TABLE IF NOT EXISTS DEMO(id INTEGER PRIMARY KEY,code,updated, latitude, longitude)");
}

function errorCB(err) {
    console.log("Error processing SQL: "+err.code);
}

function successInsert() {
    console.log("successInsert()");
}

我尝试在另一个页面中显示行:

function showCode() {
    console.log("showCode()");
    db = window.openDatabase("Database", "1.0", "PhoneGap Demo", 200000);
    db.transaction(parseDB, errorCB);
}

function parseDB(tx) {
    console.log("parseDB()");
    tx.executeSql('SELECT * FROM DEMO', [], writeEntries, errorCB);
}

function writeEntries(tx, results) {
    console.log("writeEntries()");
    var len = results.rows.length;
    document.write("DEMO table: " + len + " rows found.");
    console.log("DEMO table: " + len + " rows found.");
    for (var i=0; i<len; i++){
        document.write("Row = " + i + " ID = " + results.rows.item(i).id + " Data =  " + results.rows.item(i).code + " Latitude =  " + results.rows.item(i).latitude+ " Longitude =  " + results.rows.item(i).longitude );
        console.log("Row = " + i + " ID = " + results.rows.item(i).id + " Data =  " + results.rows.item(i).code + " Latitude =  " + results.rows.item(i).latitude+ " Longitude =  " + results.rows.item(i).longitude);
    }
}

在日志中,我可以看到创建的行。但在 html 页面中没有(但这是另一个问题:JQuery 问题)。但是当我尝试添加另一行时,第一行不再存在。

谢谢您的帮助。

4

1 回答 1

0

每次调用launchDB并删除表(如果存在)时,似乎都会调用setupDB。

文件访问也可能存在一些单独的问题,但该删除表将是首先要解决的问题。

于 2012-11-16T11:53:45.870 回答