【问题标题】:Database is not stored on Android Phone Device数据库未存储在 Android 手机设备上
【发布时间】:2025-12-30 14:25:11
【问题描述】:

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

我正在使用Cordova Storage API

我正在关注互联网上的不同示例,以了解如何在 Android 上操作数据库,例如 Create Android App with SQLite using Phonegap + Jquery mobile

其实我的问题是我不确定数据库是否是在真机上物理创建的(我是在运行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 问题)。但是当我尝试添加另一行时,第一行不再存在。

感谢您的帮助。

【问题讨论】:

    标签: android database cordova storage android-sqlite


    【解决方案1】:

    看起来 setupDB 每次调用 launchDB 并删除表(如果存在)时都会被调用。

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

    【讨论】:

    • 谢谢!我在另一部手机设备上对其进行了测试,当我删除 Drop 语句时它可以工作:)