qef*_*zec 12 database sqlite android cordova android-sqlite
我正在开发一个Android Cordova/Phonegap应用程序,我想使用SQLite数据库.我使用了官方文档中的示例.
// 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);
}
Run Code Online (Sandbox Code Playgroud)
虽然这似乎有效(数据库创建并填充没有错误,我用查询得到了写入的数据),我想知道数据库是如何存储在我的设备上的.为了调试我使用Android 4.1.1的硬件电话.
数据库位于/data/data/<myapppackage>/app_database/file__0/0000000000000001.db.现在我想导出数据库并使用SQLiteManager在我的电脑上手动分析它,但似乎更改没有写入db文件.
但是,在检查目录时,/data/data/<myapppackage>/app_database/file__0/我发现了两个临时文件,0000000000000001.db-shm并且0000000000000001.db-wal每次执行数据库操作时都会更改其时间戳,但从不会更改db文件本身.
我的问题是,为什么更改永远不会写入持久数据库文件?似乎没有办法用phonegap关闭数据库连接,甚至手动杀死应用程序也不会将更改写入.db文件.我不确定我做错了什么.
有人在这看到问题吗?
Ker*_*cks 11
tx.executeSql('DROP TABLE IF EXISTS DEMO');
Run Code Online (Sandbox Code Playgroud)
每次启动PhoneGap移动应用程序时,上面的这一行都会删除名为DEMO的表
我只是想告诉你我爱你的代码.它为任何人的PhoneGap或Cordova应用程序提供了"做什么"的非常好的线索.它将极大地帮助那些第一次进入SQLite世界的人.
与在GitHub上的Cordova/PhoneGap SQLite插件官方网站上编写的代码相比,您的代码阅读和理解非常简洁.
我的朋友,也是一家公司的CTO,并且对SQLite有很多经验,告诉我没有必要手动关闭SQLite数据库连接,并且也非常推荐SQLite.
对于其他任何寻找SQLite的PhoneGap/Cordova信息的人 -
假设您有一个名为mytable的表,并希望存储值"beautiful"和"dolphin"
当您想要在移动设备(例如平板电脑或手机)的SQLite上执行操作时,请记住以这种方式调用它
在源代码中包含以下内容
function insertNewLine(tx)
{
tx.executeSql("INSERT INTO mytable (word, meaning) VALUES (?,?)", [ var1 , var2 ]);
}
Run Code Online (Sandbox Code Playgroud)
在var2和var2中的var1和"dolphin"中存储"beautiful"
执行以下语句以执行SQL insert语句,然后保存在设备中.
db.transaction(insertNewLine);
Run Code Online (Sandbox Code Playgroud)
不要直接调用insertNewLine(tx)
不要直接调用tx.executeSql(/*SQL INSERT STATEMENT*/); 在您的JavaScript源代码中
并且不要将值直接包含在SQL查询语句中,然后运行包含要存储在数据库中的值的SQL语句.
换句话说,以下是不正确的
tx.executeSql('INSERT INTO mytable (word, meaning) values (beautiful, dolphin)');
Run Code Online (Sandbox Code Playgroud)
以上是不正确的,因为要存储的值,"漂亮"和"海豚"都包含在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
Run Code Online (Sandbox Code Playgroud)
然后通过在JavaScript代码中包含以下内容来执行整个数据库事务
db.transaction(insertNewLine);
Run Code Online (Sandbox Code Playgroud)
不是下面的代码
tx.executeSql("INSERT....."); // this will not save your values onto the device
Run Code Online (Sandbox Code Playgroud)
不是下面的代码
insertNewLine(tx); // this will not save your values onto the device either.
Run Code Online (Sandbox Code Playgroud)
要使用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);
}
Run Code Online (Sandbox Code Playgroud)
然后,执行数据库事务
db.transaction(viewthelastglory);
Run Code Online (Sandbox Code Playgroud)
如果您尝试从SQLite,WebSQL和IndexedDB中选择一个,请记住我在stackoverflow上搜索了一段时间并了解到
当您在Cordova项目的目录中时,命令行中的以下命令将SQLite插件安装到您的Cordova项目中
cordova plugin add https://github.com/brodysoft/Cordova-SQLitePlugin
Run Code Online (Sandbox Code Playgroud)
解决方案是:使用模拟器而不是物理设备调试您的应用程序。
emulator使用而不是物理设备运行您的应用程序。您将在 中找到您的database文件/data/data/YOUR_PACKAGE_NAME/app_database/。您可以pull文件database并浏览表格和数据。
| 归档时间: |
|
| 查看次数: |
25744 次 |
| 最近记录: |