2013-04-29 88 views
1

我正在为我的iOS应用使用sqlite数据库。在这里,当我尝试在表格中插入一行时,出现错误,说'数据库已被锁定'。我同意有许多问题发布为相同的和许多解决方案和给出的错误的原因,但我没有解决任何这些。 在sqlite中多线程的原因是被禁止的,数据库应该是打开的,应该调用finalize等等。我张贴我的代码以使它更透明。iOS'数据库中的Sqlite被锁定'错误

插入函数

int open=sqlite3_open([@"/Users/macintosh/Documents/Apps/Project/MyLocal DB/MyLocal.sqlite" UTF8String], &database); 

sqlite3_stmt *statement = NULL; 

const char *sql = "insert into History (MNo,PID, Move,Result,WID, CreatedOn) Values(?, ?, ?, ?, ?, ?)"; 


NSDateFormatter *DateFormatter=[[NSDateFormatter alloc] init]; 
[DateFormatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"]; 


if(open==SQLITE_OK) 
{ 

    if (sqlite3_prepare(database, sql, -1, &statement, NULL) ==SQLITE_OK) 
    { 
     sqlite3_bind_int(statement, 0, mid); 
     sqlite3_bind_int(statement, 1, pid); 
     sqlite3_bind_int(statement, 2, cno); 
     sqlite3_bind_int(statement, 3, result); 
     sqlite3_bind_int(statement, 4, wid); 
     sqlite3_bind_text(statement, 5, [[DateFormatter stringFromDate:[NSDate date]] UTF8String], -1, SQLITE_TRANSIENT); 



     if (sqlite3_step(statement)==SQLITE_DONE) 
     { 
      NSLog(@"inserted the values in table"); 

     } 
     else 
     { 
      NSLog(@" not inserted the values in table"); 
      NSLog(@"error: %s", sqlite3_errmsg(database)); 
     } 
     sqlite3_finalize(statement); 



    } 
    else 
    { 
     NSLog(@"Problem with prepare statement: %s", sqlite3_errmsg(database)); 
    } 
    sqlite3_close(database); 
    NSLog(@"db closed"); 
} 
else 
{ 
    NSLog(@"An error has occured: %s",sqlite3_errmsg(database)); 
} 

注:我已经使用了相同的功能,在很多地方插入一行,而且运作良好。我现在得到了这个错误,并且确保在运行这个语句时没有其他语句在同一个数据库上运行。

回答

4

我想你忘记了在任何地方,这就是为什么你

+0

好的我同意这个答案,因此我已经保持NSLog下面每个打开和关闭数据库语句,然后我改变了它的位置,并将其移动到另一个可写位置(它以前也位于可写位置).i重新启动我的Mac,但我仍然在那里。它仍然显示锁定。我检查了我的NSLog语句,数据库无处开放Divz。 Thanx – xrnd 2013-04-29 09:36:26

+2

嗨嗨,我刚刚发现我的错误。在我从db返回的函数之一中,没有调用finalize和close声明..帮助 – xrnd 2013-04-29 10:41:02

+0

欣赏编码:) – 2013-04-29 11:15:49

2

经常收到此错误,关闭该数据库,当你得到这样那样的错误,你必须在你的应用程序parallell进程试图在同一访问同一个数据库时间。如果是这样的话,尽量把:

sqlite3_busy_timeout(database, 500); 

的地方,并sqlite3_prepare在你的代码之间sqlite3_open

然后,数据库连接将在500毫秒内尝试读取/写入,然后放弃,这通常有足够的时间来转义锁定。

1

有两个原因:

  1. 你可能已经忘记了查询执行后关闭数据库。每次执行后都需要关闭数据库。
  2. 您可能正在同时执行多个查询。如果您同时执行多个查询,则必须在多个查询执行之间放置一些延迟。
+0

您可能正在同时执行多个查询。如果您同时执行多个查询,则必须在多个查询执行之间放置一些延迟。如何在两个查询之间添加延迟 – 2017-09-06 08:47:24