Javascript 无法写入SQLite,错误代码为6
我正在尝试从使用AngularJS、Monaca和Onsen UI创建的跨平台应用程序写入SQLite数据库 我有一个用户输入用户名和密码的视图。我阅读了这些详细信息,并将它们保存到一个服务中,以后可以使用getter和setter访问它们 但是,当我尝试从保存的服务值将详细信息写入SQLite数据库时,会得到一个错误代码6。根据,错误代码6表示数据库已锁定。为什么数据库会被锁定?如果数据库被锁定/解锁,如何向其写入值 在我的代码中,如果表在尝试写入之前不存在,我将创建该表。这就是阻塞数据库的原因吗?下面是Myapp.js代码,用于显示数据库进程Javascript 无法写入SQLite,错误代码为6,javascript,angularjs,database,sqlite,Javascript,Angularjs,Database,Sqlite,我正在尝试从使用AngularJS、Monaca和Onsen UI创建的跨平台应用程序写入SQLite数据库 我有一个用户输入用户名和密码的视图。我阅读了这些详细信息,并将它们保存到一个服务中,以后可以使用getter和setter访问它们 但是,当我尝试从保存的服务值将详细信息写入SQLite数据库时,会得到一个错误代码6。根据,错误代码6表示数据库已锁定。为什么数据库会被锁定?如果数据库被锁定/解锁,如何向其写入值 在我的代码中,如果表在尝试写入之前不存在,我将创建该表。这就是阻塞数据库的原
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;
}
根据我的常识,您在定义彼此内部的两个事务时造成了障碍 您可以从此行的数据库中保留事务:
function goInsert() {
db = window.openDatabase("myDB", "1.0", "My DB", 200000);
db.transaction(insertDB, errorCB, successCB); <--- here!!
}
函数goInsert(){
db=window.openDatabase(“myDB”、“1.0”、“myDB”,200000);
事务(insertDB,errorCB,successCB);根据我的常识,您在定义彼此内部的两个事务时造成了阻塞
您可以从此行的数据库中保留事务:
function goInsert() {
db = window.openDatabase("myDB", "1.0", "My DB", 200000);
db.transaction(insertDB, errorCB, successCB); <--- here!!
}
函数goInsert(){
db=window.openDatabase(“myDB”、“1.0”、“myDB”,200000);
transaction(insertDB,errorCB,successCB);我基本上要从sqlite文档中粘贴一小部分,并对其进行一些解释,因为在过去,我曾尝试创建一个基于sqlite的webapp,但由于这个特殊的问题,我最终更改了实现
要写入数据库,进程必须首先获取如上所述的共享锁(如果有热日志,可能会回滚未完成的更改)。获取共享锁后,必须获取保留锁。保留锁表示进程打算在将来某个时间写入数据库。一次只能有一个进程可以持有保留锁。但其他进程可以在持有保留锁的同时继续读取数据库
正如它所说的,SQLite不能同时执行两个写事务,这会使数据库进入锁定模式(有时是永久的,唯一的解锁方法是通过复制粘贴文件)
因此,您无法使用同一个SQLite文件创建多用户应用程序。如果您创建的文件是每个用户的,则必须创建一种机制,在启动新的事务之前,该机制将实际等待事务完成
这是完整的文档我基本上要从sqlite文档中粘贴一小部分,并对其进行一些解释,因为在过去,我曾尝试制作一个基于sqlite的webapp,但由于这个特殊问题,我在最后更改了实现
要写入数据库,进程必须首先获取如上所述的共享锁(如果有热日志,可能会回滚未完成的更改)。获取共享锁后,必须获取保留锁。保留锁表示进程打算在将来某个时间写入数据库。一次只能有一个进程可以持有保留锁。但其他进程可以在持有保留锁的同时继续读取数据库
正如它所说的,SQLite不能同时执行两个写事务,这会使数据库进入锁定模式(有时是永久的,唯一的解锁方法是通过复制粘贴文件)
因此,您无法使用同一个SQLite文件创建多用户应用程序。如果您创建的文件是每个用户的,则必须创建一种机制,在启动新的事务之前,该机制将实际等待事务完成
这是完整的文档事务的思想是确保在数据库中打开一个时不会执行任何其他操作。现在,您尝试将第二个作为内部操作打开,但它们的工作方式不同。一旦打开一个,另一个将阻塞数据库,正如您所观察到的那样。我删除了打开数据库的额外调用,但仍然会得到相同的错误r、 我想知道,因为这些是异步调用,我是否需要添加$timeout()也许…我会集中精力删除在另一个db.transaction回调中使用db.transaction的方法。这些方法会影响锁。事务的想法是在一个打开时在db中不做任何其他操作。现在您尝试打开第二个作为内部事务的方法,但它们不能像那样工作。一旦一个打开,另一个JU就会出现正如您所观察到的,t阻塞了db。我删除了打开数据库的额外调用,但仍然得到了相同的错误。我想知道,因为这些是异步调用,我是否需要添加$timeout()。也许……我会集中精力删除在另一个这样的db.transaction回调中使用db.transaction的方法。这些方法会影响锁。