Sqlite:检查数据库是否存在

时间:2014-03-02 09:03:20

标签: javascript sqlite cordova

我正在开发一个使用phonegap的移动应用程序,它将一些数据存储到本地数据库(sqlite DB)。 我需要知道数据库是否存在,以及确定需要执行哪个进程。

var database = window.openDatabase("my_db", "1.0", "sample DB", 30000);
if (check_db_exist()) {
    process_1();
}
else
{
    process_2();
}

3 个答案:

答案 0 :(得分:2)

我需要做类似的事情,我需要检查应用程序是否已创建数据库(旧数据库),如果是,则将所有数据导出到新数据库(新数据库和改进数据库),然后删除此数据库。< / p>

背景信息:我正在从简单的键值表转移到具有级联等的复杂关系数据库。

function onDeviceReady() {
    // CHECK IF LEGACY DATABASE EXISTS. IF DOES EXPORT EXISTING DATA TO NEW DB THEN DELETE LEGACY
    window.resolveLocalFileSystemURL(cordova.file.applicationStorageDirectory + "/databases/<DatabaseName>.db", exportToNewDB, setupDB);
}

注意:如果文件存在(成功),那么我们需要在这里执行导出代码,然后删除文件,这样这个方法总是会失败。如果文件不存在 - 用户已经导出到新数据库,或者他们是我们的新用户,并且从未拥有旧数据库。

// Fail Method
function setupDB() {
    newDB = window.sqlitePlugin.openDatabase({ name: "<NewImprovedDBName>.db" });
    newDB.transaction(sql.initDB, sql.errorCallback, sql.successCallBack);
}
// Success Method
function exportToNewDB() {
    db = window.sqlitePlugin.openDatabase({ name: "<LegacyDBName>.db" });
    db.transaction(function (tx) {
         setupDB();
         // Insert Export code Here

         // Delete DB
         window.sqlitePlugin.deleteDatabase("<LegacyDBName>.db", sqlSuccess, sqlFail);
    }, sqlFail);
}

回答你的问题:

window.resolveLocalFileSystemURL(cordova.file.applicationStorageDirectory + "/databases/my_db.db", process_1, process_2);

答案 1 :(得分:1)

确定数据库是否存在的最佳方法是检查表示数据库的文件是否存在。这是一个简单的IO操作,如下例所示:

string path = Path.Combine(ApplicationData.Current.LocalFolder.Path, databaseName);

if (File.Exists(path)) { //your code here }

答案 2 :(得分:0)

我不认为您可以直接检查数据库是否存在。我已经研究过,并且找不到使用简单函数调用的方法。但是,这似乎是一个受欢迎的请求,这是一个解决方法:

var db = window.openDatabase("my.db", "1", "Demo", -1);


db.transaction(function (tx) {

/*I don't think that there is a way to check if a database exists.
    As I think that the openDatabase call above will just create
    a missing DB. Here is a second-best way to do it - there 
    is a way to check to see if a table exists.  Just pick a table that 
    your DB should have and query it.  If you get an ERROR, then you 
    can assume your DB is missing and you will need to create it. */

console.log("Trying to get the test data");
tx.executeSql("select * from test_table", [], function (tx, res) {

    var len = res.rows.length, i;
    for (i = 0; i < len; i++) {
        console.log(res.rows.item(i).data);
    }
}, function (err) {
    console.log("Error selecting: " + err);

    //NOW we need to create the DB and populate it
    tx.executeSql('CREATE TABLE IF NOT EXISTS test_table (id integer primary key, data text)');

    tx.executeSql('INSERT INTO test_table (data) VALUES("test data one")');
    tx.executeSql('INSERT INTO test_table (data) VALUES("test data two")');

    //now test select
    tx.executeSql("select * from test_table", [], function (tx, res) {

        var len = res.rows.length, i;
        for (i = 0; i < len; i++) {
            console.log(res.rows.item(i).data);
        }
    });


    //now clean up so we can test this again
    tx.executeSql('DROP TABLE IF EXISTS test_table', [], function (tx, res) {
        console.log("dropped table");
    }, function (err) {
        console.log("Error dropping table: " + err);
    });

});
});

如您所见,第一次查询期间的错误函数将创建并填充数据库。它使用异常处理程序逻辑流程,但它可以工作!