Ios Obj-C和Javascript之间的SQLite锁定错误
我有一个 iOS 在Ios Obj-C和Javascript之间的SQLite锁定错误,ios,sqlite,fmdb,Ios,Sqlite,Fmdb,我有一个 iOS 在UIWebView中使用小技巧/黑客在Objective-C和Javascript之间通信的应用程序 一个SQLite数据库和模式是在启动时使用创建的 当应用程序运行时,Obj-C代码每秒从电路板读取数据,并将数据写入同一SQLite数据库。同样,Javascript每秒都会从数据库中读取并执行一些Javascript来更新UIWebView。因此,DB文件上没有太多负载 在尝试写入DB时,我不时会遇到DB锁定错误(我正在使用它执行所有sql): 该表非常基本,插入代码也同样
UIWebView
中使用小技巧/黑客在Objective-C和Javascript之间通信的应用程序
一个SQLite
数据库和模式是在启动时使用创建的
当应用程序运行时,Obj-C
代码每秒从电路板读取数据,并将数据写入同一SQLite
数据库。同样,Javascript每秒都会从数据库中读取并执行一些Javascript来更新UIWebView
。因此,DB文件上没有太多负载
在尝试写入DB时,我不时会遇到DB锁定错误(我正在使用它执行所有sql):
该表非常基本,插入代码也同样基本,我只是插入一些浮点值:
NSString*insertSql=@“插入演示2(时间、tc1、tc2、tc3、tc4、hr)值(%f、%f、%f、%f、%f)”;
BOOL内部交易=[[u fmdb beginDeferredTransaction];
如果(!内部传输){
NSLog(@“RLog:错误代码:%d,%@,[[u fmdb lastErrorCode],[u fmdb lastErrorMessage]);
}
BOOL success=[\u fmdb executeUpdateWithFormat:insertSql、time、tc1、tc2、tc3、tc4、hr];
如果(!成功){
NSLog(@“RLog:错误代码:%d,%@,[[u fmdb lastErrorCode],[u fmdb lastErrorMessage]);
}
[_fmdbcommit];
奇怪的是,当我执行一些从一个完全独立的SQLite文件读取的其他操作时,这种情况似乎经常发生,该文件只能从Obj-C
代码访问(不用于Obj-C
和JS之间的通信桥)
我不知道为什么或如何用如此少量的读写操作锁定数据库。如果这些计时器有可能从单独的线程调用或同时运行,那么您可能需要做的就是使用
FMDatabaseQueue
而不是直接使用数据库,即:
例如,将其作为_fmdb的对等方:
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath];
self.fmdbQueue = queue;
随后:
[_fmdbQueue inDeferredTransaction:(FMDatabase *db, BOOL *rollback) {
// read data from the db
FMResultSet *rs = [db executeQuery:@"select * from foo"];
while ([rs next]) {
…
}
// write data out
NSString *insertSql = @"INSERT INTO DEMO2 (time, tc1, tc2, tc3, tc4, hr) VALUES "
"(%f, %f, %f, %f, %f, %f)";
BOOL success = [_fmdb executeUpdateWithFormat:insertSql, time, tc1, tc2, tc3, tc4, hr];
if ( ! success ) {
NSLog(@"RLog: err code: %d, %@", [_fmdb lastErrorCode], [_fmdb lastErrorMessage]);
*rollback = YES;
return;
}
}]; // commit will be executed automatically for us if we didn't flip the value of *rollback.
这样,所有读/写操作都将发生,以消除两个操作试图同时运行的可能性
注意:这假设UIWebView(Javascript)没有打开/锁定它。如果是,那么我不确定如何保护它,除非您将db的创建移出javascript(即,全部在Objective C中)
[_fmdbQueue inDeferredTransaction:(FMDatabase *db, BOOL *rollback) {
// read data from the db
FMResultSet *rs = [db executeQuery:@"select * from foo"];
while ([rs next]) {
…
}
// write data out
NSString *insertSql = @"INSERT INTO DEMO2 (time, tc1, tc2, tc3, tc4, hr) VALUES "
"(%f, %f, %f, %f, %f, %f)";
BOOL success = [_fmdb executeUpdateWithFormat:insertSql, time, tc1, tc2, tc3, tc4, hr];
if ( ! success ) {
NSLog(@"RLog: err code: %d, %@", [_fmdb lastErrorCode], [_fmdb lastErrorMessage]);
*rollback = YES;
return;
}
}]; // commit will be executed automatically for us if we didn't flip the value of *rollback.