我正在开发一个使用phonegap的移动应用程序,它将一些数据存储到本地数据库(sqlite DB)。 我需要知道数据库是否存在,以及确定需要执行哪个进程。
var database = window.openDatabase("my_db", "1.0", "sample DB", 30000);
if (check_db_exist()) {
process_1();
}
else
{
process_2();
}
答案 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);
});
});
});
如您所见,第一次查询期间的错误函数将创建并填充数据库。它使用异常处理程序逻辑流程,但它可以工作!