Sqlite数据库在插入数据时在某些情况下被locking

我的Iphone应用程序有问题。 有一段时间我的应用程序运行成功,但在某些情况下,它给“databse被locking的exception”这就是为什么我无法从sqlite数据读取或插入数据。 如果任何人有一些解决scheme,请build议我。 这是我的数据插入数据库的代码谢谢。

-(void)insertDataIntoDatabase { NSLog(@"insertDataIntoDatabase-----1"); @try{ tUserName=userNameTf.text; tLevel=[NSString stringWithFormat:@"%d",level]; tMoves=[NSString stringWithFormat:@"%d",moves]; NSLog(@"tLevel;;;%@",tLevel); // NSString *tdatabaseName = @"FlipScoreBord.sqlite"; sqlite3_stmt *addStatement; // NSArray *tdocumentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); // NSString *tdocumentsDir = [tdocumentPaths objectAtIndex:0]; // NSString *tdatabasePath = [tdocumentsDir stringByAppendingPathComponent:tdatabaseName]; NSString *insertQuery = [NSString stringWithFormat:@"INSERT INTO Moves (User_Name,User_Label,User_Moves) VALUES('%@','%@','%@')",tUserName,tLevel,tMoves]; const char *sql = [insertQuery cStringUsingEncoding:NSUTF8StringEncoding]; if(sqlite3_prepare_v2(tdatabase, sql, -1, &addStatement, NULL) != SQLITE_OK) { NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(tdatabase)); } sqlite3_bind_text(addStatement, 0, [tUserName UTF8String], -1, SQLITE_TRANSIENT); sqlite3_bind_text(addStatement, 1, [tLevel UTF8String], -1, SQLITE_TRANSIENT); sqlite3_bind_text(addStatement, 2, [tUserName UTF8String], -1, SQLITE_TRANSIENT); if(SQLITE_DONE != sqlite3_step(addStatement)) { NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(tdatabase)); sqlite3_reset(addStatement); } sqlite3_close(tdatabase); } @catch (NSException *r) { NSLog(@"Exception---- %@",r); } NSLog(@"insertDataIntoDatabase-----2"); } 

我必须承认,我使用FMDB(一个SQLite包装,使我与SQLite函数隔离),但是有几件事看起来很奇怪:

  1. 如果你sqlite3_prepare_v2()一个语句,你不需要你的sqlite3_finalize()?

  2. 它看起来像你在这里closures数据库,但不打开它。 看起来像这样会打开sqlite3_open()语句和sqlite3_close()调用不平衡的可能性。 你100%确信这不是问题吗? 我会尝试在开放和closures声明中放入NSLog,并确保它们是平衡的。

这两个问题的组合使我想知道,如果你的意思是sqlite3_finalize()你现在有sqlite3_close()。

只是一些想法。

此链接列出数据库locking错误如何触发的原因:

http://www.sqlite.org/cvstrac/wiki?p=DatabaseIsLocked

引用其中一个原因:

尝试在同一个表上的SELECT处于活动状态时写入表。

由于您没有在您的语句中调用sqlite3_finalize,因此之前的“SELECT”语句可能会阻止您的“INSERT”。 在调用sqlite3_close之前,尝试添加一个sqlite3_finalize。