我使用下面的代码来更新查询使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
Rob*_*Rob 11
通常,如果您同时进行多个查询(或者您没有完成某些早期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当你完成所有准备好的语句时你仍然需要).
| 归档时间: |
|
| 查看次数: |
2577 次 |
| 最近记录: |