当前位置: 首页 > 面试题库 >

更新查询时,iOS中的“数据库锁定”错误

方航
2023-03-14
问题内容

我使用下面的代码 来更新查询 使用sqlite
但是我越来越"database is locked error"
我尝试搜索一些SO链接,建议关闭数据库,但是我再次遇到相同的错误。我已经提到我在代码中出现错误的地方。

const char *dbpath = [databasePath UTF8String];
if (sqlite3_open(dbpath, &database) == SQLITE_OK)
{
    NSString *locationNo =NULL;
    NSString *querySQL = [NSString stringWithFormat:@"select count(*) from code"];
    const char *query_stmt = [querySQL UTF8String];

    if (sqlite3_prepare_v2(database,query_stmt, -1, &statement, NULL) == SQLITE_OK)
    {
        if (sqlite3_step(statement) == SQLITE_ROW)
        {
            locationNo = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)];
            int count= [locationNo intValue];
            sqlite3_close(database);
            NSLog(@"%@",locationNo);
            if(0==count)
            {
                NSString *insertSQL = [NSString stringWithFormat:@"insert into favourite_code (code_id,code_1,code_2,code_3,code_4,code_5,code_6, status, record_status) VALUES (\"%d\",\"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\")",1 ,code1,code2,code3,code4,code5,code6,@"Y", @"Y"];

                const char *insert_stmt = [insertSQL UTF8String];
                sqlite3_prepare_v2(database, insert_stmt,-1, &statement, NULL);
                if (sqlite3_step(statement) == SQLITE_DONE)
                {
                    return YES;
                }
                else {
                    return NO;
                }
                sqlite3_reset(statement);
                sqlite3_close(database);
            }
            else{


                =========================== Getting Error in the below lines =========================

                const char *sq1l = "update code SET code_1=?, code_2=?, code_3=?, code_4=?, code_5=?,code_6=? WHERE code_id=1";

                if (sqlite3_prepare_v2(database, sq1l, -1, &statement, NULL) != SQLITE_OK)
                {
                    NSLog(@"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(database));
                }
                else
                {
                    sqlite3_bind_text(statement, 1, [code1 UTF8String], -1, SQLITE_TRANSIENT);
                    sqlite3_bind_text(statement, 2, [code1 UTF8String], -1, SQLITE_TRANSIENT);
                    sqlite3_bind_text(statement, 3, [code1 UTF8String], -1, SQLITE_TRANSIENT);
                    sqlite3_bind_text(statement, 4, [code1 UTF8String], -1, SQLITE_TRANSIENT);
                    sqlite3_bind_text(statement, 5, [code1 UTF8String], -1, SQLITE_TRANSIENT);
                    sqlite3_bind_text(statement, 6, [code1 UTF8String], -1, SQLITE_TRANSIENT);

                }

                int success = sqlite3_step(statement);
                if (success != SQLITE_DONE)
                {
                    NSLog(@"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(database));
                    //result = FALSE;
                }
                else
                {
                    NSLog(@"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(database));
                    //result = TRUE;
                }

                =================================END=========================================


            }

            sqlite3_reset(statement);
        }
        else
        {
            NSLog(@"Not found");
            locationNo=@"1";
        }
        sqlite3_reset(statement);
    }
}

问题答案:

通常,如果您同时进行多个查询(您没有完成一些早期的SQL语句,或者您打开了多个线程,或者您多次打开了数据库),就会得到此信息。

这段代码对sqlite3_close和的使用有些混乱,sqlite3_reset(和缺少sqlite3_finalize),这可能是问题的根源。

在《 SQLite C / C ++接口简介》中,他们指出了正确的语句顺序:

  • sqlite3_open(),打开一个数据库
  • sqlite3_prepare(),准备一条sql语句
  • sqlite3_bind(),将值绑定到?必要的占位符
  • sqlite3_step(),执行sql和/或逐步执行结果
  • sqlite3_column(),以根据需要检索数据
  • sqlite3_finalize(),以完成/关闭准备好的sql语句
  • sqlite3_close(),关闭数据库

最重要的sqlite3_open是,您的调用sqlite3_close在结尾处没有与单个语句匹配(但是您sqlite3_close的代码中间有多余的内容)。另外,每个都sqlite3_prepare_v2必须有自己的sqlite3_finalize(仅sqlite3_reset在要重置准备好的语句时使用,以便可以将其与新值绑定并再次遍历;但是sqlite3_finalize在准备好的语句全部用完时仍然需要)。



 类似资料:
  • 我正在处理的程序包含两个类,GUI和DatabaseHelper。使用的表模型是DefaultTableModel。 GUI包含一个简单的JTable。它在启动时使用来自DatabaseHelper的数据初始化。这管用。 然而,当尝试将新数据加载到表中时,就不是那么直接了当了。 到目前为止,我的做法是: 现在发生的情况是,加载的数据被附加到已经存在的JTable上。 如果可能的话,我希望实现一个仅

  • 问题内容: 鉴于: 我想自动执行以下操作:更新客户(如果已经存在);否则,插入一个新客户。 从理论上讲,这听起来似乎非常适合SQL- MERGE, 但是我正在使用的数据库不支持将AUTO_INCREMENT列与MERGE配合使用。 似乎表明,如果对不存在的行执行查询或更新语句,数据库将锁定索引,从而防止并发插入。 SQL标准可以保证这种行为吗?是否有任何数据库无法以这种方式运行? 更新 :对不起,

  • 问题内容: 当用户最初单击按钮时,将运行查询,并将每一行放入JPanel中并添加到显示中,以供用户查看。哪个工作正常。 我的问题是,我希望用户能够根据它们提供的值(通过JTextField)过滤这些结果,并且我希望显示的记录随着JTextField值的更改而更新。每次更改JTextField时都会形成并执行我的查询,但是我找不到更新显示记录的方法。 任何帮助,将不胜感激。 该代码花了一些时间进行编

  • 本文向大家介绍java数据库连接、查询、更新等,包括了java数据库连接、查询、更新等的使用技巧和注意事项,需要的朋友参考一下 1、java数据库连接、查询、更新 2、连接数据库 这篇文章就介绍到这,下一篇将为大家更好的更相关的文章。

  • 尝试使用PostgreSQL 9.2在表上运行这样的更新语句: 我们需要能够在 ~10M 行表上运行它,而不是让它锁定表(因此在更新运行时仍然可以进行正常操作)。我相信使用游标可能是正确的解决方案,但我真的不知道它是否是正确的,或者我应该如何使用游标实现它。 我想出了这个光标代码,我认为这可能很好。 编辑:添加光标功能

  • 问题内容: 我在golang中使用sqlite3数据库,但出现错误:“数据库已锁定”。 我知道使用同一数据库文件不能有多个线程。 尽管我的程序中只有一个连接并关闭了所有查询结果,但是它始终会创建2或3个数据库文件的句柄。 我通过使用opendfileview程序对它进行了云检查。 任何人都可以帮助我解决这个问题。提前致谢。 以下代码创建两个数据库文件句柄。 问题答案: 尝试延迟: