我正在开发一个想要使用SQLite数据库的Android Cordova/Phonegap应用程序。我使用了官方documentation中的示例。

// Wait for device API libraries to load
//
document.addEventListener("deviceready", onDeviceReady, false);

// Populate the database
//
function populateDB(tx) {
    tx.executeSql('DROP TABLE IF EXISTS DEMO');
    tx.executeSql('CREATE TABLE IF NOT EXISTS DEMO (id unique, data)');
    tx.executeSql('INSERT INTO DEMO (id, data) VALUES (1, "First row")');
    tx.executeSql('INSERT INTO DEMO (id, data) VALUES (2, "Second row")');
}

// Query the database
//
function queryDB(tx) {
    tx.executeSql('SELECT * FROM DEMO', [], querySuccess, errorCB);
}

// Query the success callback
//
function querySuccess(tx, results) {
    var len = results.rows.length;
    console.log("DEMO table: " + len + " rows found.");
    for (var i=0; i<len; i++){
        console.log("Row = " + i + " ID = " + results.rows.item(i).id + " Data =  " + results.rows.item(i).data);
    }
}

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

// Transaction success callback
//
function successCB() {
    var db = window.openDatabase("Database", "1.0", "Cordova Demo", 200000);
    db.transaction(queryDB, errorCB);
}

// device APIs are available
//
function onDeviceReady() {
    var db = window.openDatabase("Database", "1.0", "Cordova Demo", 200000);
    db.transaction(populateDB, errorCB, successCB);
}

尽管这似乎可行(创建并填充数据库时没有错误,并且我通过查询返回了写入的数据),但我想知道数据库如何存储在设备上。为了进行调试,我使用了配备Android 4.1.1的硬件电话。

该数据库位于/data/data/<myapppackage>/app_database/file__0/0000000000000001.db下。现在,我想导出数据库并使用SQLiteManager在我的PC上对其进行手动分析,但是似乎所做的更改未写入到db文件中。

但是,在检查目录/data/data/<myapppackage>/app_database/file__0/时,我找到了两个临时文件0000000000000001.db-shm0000000000000001.db-wal,每次我执行数据库操作时它们的时间戳都会更改,但是db文件本身却不会。

我的问题是,为什么更改从未写入永久数据库文件?似乎没有办法用phonegap关闭数据库连接,甚至手动终止该应用程序也不会将更改写入.db文件。我不确定自己做错了什么。

有人在这里看到问题吗?

最佳答案

tx.executeSql('DROP TABLE IF EXISTS DEMO');

每次启动PhoneGap移动应用程序时,上面的这一行都会删除名为DEMO的表

我只是想告诉您我喜欢您的代码。它为任何人的PhoneGap或Cordova应用程序提供了一个“做什么”的很好的线索。这将极大地帮助任何首次进入SQLite领域的人。

与在GitHub上的Cordova/PhoneGap SQLite插件官方网站上编写的代码相比,您的代码易于阅读和理解。

我的 friend 兼公司的首席技术官,对SQLite有丰富的经验,他告诉我,不必手动关闭SQLite数据库连接,因此强烈建议使用SQLite。

对于寻找SQLite来获取PhoneGap/Cordova信息的其他人-

假设您有一个名为mytable的表,并且想要存储值“beautiful”和“dolphin”

当您要在平板电脑或手机等移动设备的SQLite上执行操作时,请记住以这种方式调用它

在源代码中包含以下内容
function insertNewLine(tx)
{
   tx.executeSql("INSERT INTO mytable (word, meaning) VALUES (?,?)", [ var1 , var2 ]);
}

并将“美丽”存储在var1内,将“海豚”存储在var2内,

请执行以下语句以执行SQL插入语句,然后将其保存在设备中。
db.transaction(insertNewLine);

不要直接调用insertNewLine(tx)

不要直接调用tx.executeSql(/* SQL INSERT STATEMENT */);在您的JavaScript源代码中

并且不要将值直接包含到SQL查询语句中,然后运行包含要存储在数据库中的值的SQL语句。

换句话说,以下是错误的
tx.executeSql('INSERT INTO mytable (word, meaning) values (beautiful, dolphin)');

上面的方法是不正确的,因为您要存储的值“beautiful”和“dolphin”已包含在SQL语句中。它们应该分开。

以下是运行INSERT SQL的正确方法
tx.executeSql("INSERT INTO mytable (word, meaning) VALUES (?,?)", [ var1 , var2 ]);
 // Notice that the values you want to store, beautiful and dolphin
 // are separate from the SQL INSERT INTO statement

然后通过在JavaScript代码中包含以下内容来执行整个数据库事务
db.transaction(insertNewLine);

不是下面的代码
tx.executeSql("INSERT....."); // this will not save your values onto the device

不是下面的代码
insertNewLine(tx); // this will not save your values onto the device either.

并使用SELECT SQL语句,具有以下代码
// Get all lines in the table
//
function viewthelastglory(tx)
{
    tx.executeSql( 'SELECT * FROM CUSTOMTABLE', [], querySuccess, errorcode );
}

// Deal with the lines
//
function querySuccess(tx, results)
{
   var len = results.rows.length; var  queryresult = "all entries ";

   for (var i = 0 ; i < len ; i++)
   {
       queryresult =  queryresult +

       " Row - " + i +
       " Word - " + results.rows.item(i).word +
       " Meaning - " + results.rows.item(i).meaning;
   }

// and now, you can use the queryresult variable to use the values
}

function errorcode(errorhaha)
{
    alert("Error Code " + errorhaha.code + " Error Message " + errorhaha.message);
}

然后,执行数据库事务
db.transaction(viewthelastglory);

如果您尝试从SQLite,WebSQL和IndexedDB中选择一种,请记住,我在stackoverflow上搜索了一段时间,并了解到
  • 没人喜欢IndexedDB,因为它很复杂
  • IndexedDB与许多类型和版本的移动操作系统
  • 不兼容
  • W3C弃用了WebSQL
  • WebSQL返回673K结果,而SQLite返回1800K结果。 IndexedDB在Google
  • 上返回30万个结果
  • 在IndexedDB,SQLite和WebSQL中,SQLite是唯一具有官方网站的数据库。

  • 当您位于Cordova项目目录中时,在命令行中的以下命令会将SQLite插件安装到Cordova项目中
    cordova plugin add https://github.com/brodysoft/Cordova-SQLitePlugin
    

    09-26 01:01
    查看更多