iOS'数据库中的Sqlite被锁定'错误

时间:2013-04-29 07:28:16

标签: ios database sqlite insert

我正在为我的iOS应用程序使用sqlite db。在我尝试在表中插入一行时,我收到一条错误消息“数据库被锁定”。我同意有很多问题针对错误提供了相同和许多解决方案和原因,但我的任何问题都没有解决。 禁止在sqlite中进行多线程处理的原因,数据库应该打开,应该调用finalize等。我发布我的代码以使其更透明。

插入功能

 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));
}

注意:我在很多地方使用了相同的功能来插入一行,效果很好。我现在收到此错误,并确保在运行此语句时没有其他语句在同一数据库上运行。

3 个答案:

答案 0 :(得分:4)

我想您忘记在任何接收此错误的地方关闭此数据库

答案 1 :(得分:2)

通常,当您遇到此类错误时,您的应用中会有同时尝试访问同一数据库的并行流程。如果是这种情况,请尝试:

sqlite3_busy_timeout(database, 500);

代码中sqlite3_opensqlite3_prepare之间的某处。

然后数据库连接将在放弃之前500毫秒内尝试读/写,这通常足以逃脱锁定。

答案 2 :(得分:2)

这有两个原因:

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