2012-05-04 60 views
0

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

-(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"); 

} 
+0

这是一个多线程的应用程序?这肯定会导致锁定问题。 – Rob

+0

否它不是多线程应用程序 – Suraj

回答

1

我不得不承认,我使用FMDB(一个SQLite的包装,绝缘我从SQLite的功能),但两件事情看起来很奇怪:

  1. 如果sqlite3_prepare_v2()发表声明,你不需要你的sqlite3_finalize()?

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

这两个问题让我不知道你的意思sqlite3_finalize(),您目前已sqlite3_close组合()。

只是一些想法。

1

此链接中列出的原因数据库锁定错误如何被触发:

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

引述的理由之一:

试图写一个表,而一个SELECT在同一个表上处于活动状态。

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