我使用下面的代码 来更新查询 使用sqlite。 但是我越来越"database is locked error"。 我尝试搜索一些SO链接,建议关闭数据库,但是我再次遇到相同的错误。我已经提到我在代码中出现错误的地方。
sqlite
"database is locked error"
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),这可能是问题的根源。
sqlite3_close
sqlite3_reset
sqlite3_finalize
在《 SQLite C / C ++接口简介》中,他们指出了正确的语句顺序:
sqlite3_open()
sqlite3_prepare()
sqlite3_bind()
sqlite3_step()
sqlite3_column()
sqlite3_finalize()
sqlite3_close()
最重要的sqlite3_open是,您的调用sqlite3_close在结尾处没有与单个语句匹配(但是您sqlite3_close的代码中间有多余的内容)。另外,每个都sqlite3_prepare_v2必须有自己的sqlite3_finalize(仅sqlite3_reset在要重置准备好的语句时使用,以便可以将其与新值绑定并再次遍历;但是sqlite3_finalize在准备好的语句全部用完时仍然需要)。
sqlite3_open
sqlite3_prepare_v2