我试图从一个跨平台应用程序中写入SQLite数据库,该应用程序使用AngularJS、Monaca和Onsen创建。
我有一个视图,用户输入用户名和密码。我阅读了这些细节,并将它们保存到一个服务中,在那里我可以稍后使用getter和setter访问它们。
但是,当我尝试从保存的服务值将详细信息写入SQLite数据库时,我会得到一个错误代码6。根据这,错误代码6意味着数据库被锁定。为什么要锁定数据库?如果数据库被锁定/解锁,我如何将值写入数据库?
在我的代码中,如果表在尝试编写之前还不存在,我就会创建它。这就是阻塞数据库的原因吗?下面的app.js代码显示数据库进程。
var db;
document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
db = window.openDatabase("myDB", "1.0", "My DB", 200000);
db.transaction(createDB, errorCB, successCB);
}
function createDB(tx) {
tx.executeSql('CREATE TABLE IF NOT EXISTS tb_remember_me (id INTEGER PRIMARY KEY, name)');
}
// User clicks the "login" button =- write details to Database
$scope.validateLogin = function () {
// Open DB and write to it
db = window.openDatabase("myDB", "1.0", "My DB", 200000);
db.transaction(goInsert, errorCB, successCB);
};
function goInsert() {
db = window.openDatabase("myDB", "1.0", "My DB", 200000);
db.transaction(insertDB, errorCB, successCB);
}
function insertDB(tx) {
// Get the User entered details from Shared Service
$userID = SharedProperties.getUserID(); // WORKING
$userPIN = SharedProperties.getUserPIN(); // WORKING
tx.executeSql('INSERT INTO tb_remember_me (id, name) VALUES (?,?)', [$userID, $userPIN]); // Error generated here
}
// Transaction error callback
function errorCB(err) {
alert("Error processing SQL with ERROR CODE: " + err.code);
}
// Transaction success callback
function successCB() {
return true;
}发布于 2016-06-16 16:02:53
根据我的常识,您是在定义彼此内部的两个事务时导致阻塞的。
您可以从这一行的数据库中预订事务:
function goInsert() {
db = window.openDatabase("myDB", "1.0", "My DB", 200000);
db.transaction(insertDB, errorCB, successCB); <--- here!!
}再试试里面的另一个:
// called inside previous function.
function goInsert() {
db = window.openDatabase("myDB", "1.0", "My DB", 200000);
db.transaction(insertDB, errorCB, successCB); <-- in here inside the call you make another transaction.
}因此,数据库是从第一个db.transaction行的事务中保留的,内部函数是在发生另一个db.transaction时导致阻塞的原因。
发布于 2016-06-20 11:20:52
我基本上要从sqlite文档中粘贴一小部分,并解释一下,因为过去我尝试做一个基于SQLite的webapp,并且由于这个特殊的问题,我在最后更改了实现
要写入数据库,进程必须首先获得如上所述的共享锁(如果存在热日志,则可能回滚不完整的更改)。获得共享锁后,必须获取保留锁。保留的锁信号表明进程打算在将来的某个时候写入数据库。一次只有一个进程可以持有保留锁。但是,其他进程可以在保留锁保持时继续读取数据库。
正如它所指出的,SQLite也不能执行两个写事务,这将使数据库进入锁定模式(有时是永久的,唯一的解锁方法是通过复制粘贴文件)。
因此,您不能使用相同的SQLite文件制作多用户应用程序。如果文件为每个用户,则必须创建一种机制,该机制将在启动新事务之前实际等待事务完成。
https://stackoverflow.com/questions/37807064
复制相似问题