Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;“数据库已锁定”;更新查询时在ios中出错_Ios_Sql_Sqlite - Fatal编程技术网

&引用;“数据库已锁定”;更新查询时在ios中出错

&引用;“数据库已锁定”;更新查询时在ios中出错,ios,sql,sqlite,Ios,Sql,Sqlite,我正在使用下面的代码使用sqlite更新查询 但是我得到了“数据库被锁定错误” 我试着搜索一些SO链接,有人建议关闭数据库,但我还是这样做了,我得到了同样的错误。我已经提到了代码中出现错误的地方 const char *dbpath = [databasePath UTF8String]; if (sqlite3_open(dbpath, &database) == SQLITE_OK) { NSString *locationNo =NULL; NSString *qu

我正在使用下面的代码使用
sqlite更新查询
但是我得到了“数据库被锁定错误”

我试着搜索一些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\u close
sqlite3\u reset
(以及缺少
sqlite3\u finalize
)的使用有点混淆,这可能是问题的根源

在中,他们指出了陈述的正确顺序:

  • sqlite3\u open()
    ,以打开数据库
  • sqlite3\u prepare()
    ,以准备sql语句
  • sqlite3\u bind()
    ,是否将值绑定到?必要时使用占位符
  • sqlite3\u step()
    ,以执行sql和/或逐步遍历结果
  • sqlite3\u column()
    ,根据需要检索数据列
  • sqlite3\u finalize()
    ,以完成/关闭准备好的sql语句
  • sqlite3\u close()
    ,以关闭数据库

底线,您的调用与末尾的单个语句不匹配(但在代码的中间有一个无关的<代码> SqLeTe3OxOuts)。此外,每个语句都必须有自己的语句(只有当您想重置一个准备好的语句,以便可以将其与新值绑定并再次执行时,才可以使用它;但是当您完成准备好的语句后,仍然需要

sqlite3\u finalize

谢谢您的回答。我试了你说的话。我删除了sql\u close,并且只完成了我删除的重置,但仍然收到相同的错误。我做得对吗?如果我错了,请更正。@2vision2关闭数据库并用finalize替换重置是必要的步骤。但根本问题可能是您打开数据库两次。例如,您的代码段在开始时打开数据库,但在结束时不关闭它。如果你运行两次,就会有问题。确保你的开场白和开场白是一致的。确保每个
sqlite3\u open
都有一个
sqlite3\u close
,每个
sqlite3\u prepare\u v2
都有一个
sqlite3\u finalize
@2vision2同样,您在这里做的是多线程代码吗(例如GCD、
NSOperationQueue
,或任何异步技术)?从多个线程/队列访问数据库时必须特别小心。是的,你说得对!对于每一个开放,我没有一个结束,现在它得到了工作后,匹配每一个开放与结束。谢谢你的快速回复。我花了好几个小时试图解决这个问题。但是,我没有在循环中使用finalize。谢谢