【问题标题】:Sqlite in iOS 'database is locked' erroriOS'数据库被锁定'错误中的Sqlite
【发布时间】:2013-04-29 07:28:15
【问题描述】:

我正在为我的 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));
}

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

【问题讨论】:

    标签: ios database sqlite insert


    【解决方案1】:

    我认为您忘记在任何地方关闭此数据库,这就是您收到此错误的原因

    【讨论】:

    • 好的,我同意这个答案,因此我将 NSLog 保留在每个打开和关闭 db 语句的下方,然后我更改了它的位置并将其移动到另一个可写位置(它以前也位于可写位置)。我重新启动了我的 Mac,但我仍然在那里。它仍然显示锁定。我检查了我的 NSLog 语句,DB 无处可打开 Divz。谢谢
    • 嘿嗨,我刚刚发现我的错误。在其中一个函数中,我从 db 返回而没有调用 finalize 和 close 语句..thanx 寻求帮助
    【解决方案2】:

    这有两个原因:

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

    【讨论】:

    • 您可能同时执行多个查询。如果您同时执行多个查询,则必须在多个查询执行之间放置一些延迟。如何在两个查询之间添加延迟
    【解决方案3】:

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

    sqlite3_busy_timeout(database, 500);
    

    在您的代码中介于 sqlite3_opensqlite3_prepare 之间。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-09
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 2021-11-20
      • 1970-01-01
      相关资源
      最近更新 更多