2014-09-25 35 views
1

我正在开发一个使用sqlite的iOS应用程序。这是一个非常以数据为中心的应用程序,所以我创建了一个名为prepareQuery的函数。我不会多次访问数据库,所以cmd是全球性的,并且工作得很好。sqlite_finalize不释放数据库锁定

-(BOOL) prepareQuery:(NSString *) query 
{ 
    const char *dbPath = [databasePath UTF8String]; 
    if (sqlite3_open(dbPath, &db) == SQLITE_OK) 
    { 
     const char *query_stmt = [query UTF8String]; 
     if (sqlite3_prepare_v2(db, query_stmt, -1, &cmd, NULL) == SQLITE_OK) 
      return YES; 
    } 
    return NO; 
} 

现在我有以下(编辑以可读性)

[self prepareQuery:@"SELECT STATEMENT FOR TABLE 1;"]; 
NSLog(@"Result: %i", sqlite3_step(cmd));  
//Work with the 1st query 
sqlite3_finalize(cmd); 

[self prepareQuery:@"SELECT STATEMENT FOR TABLE 2;"]]; 
NSLog(@"Result: %i", sqlite3_step(cmd)); 
//Work with the 2nd query  
sqlite3_finalize(cmd); 

if ([self prepareQuery:@"INSERT STATEMENT FOR TABLE 1;"]) 
    NSLog(@"Result: %i", sqlite3_step(cmd)); 
else 
    NSLog(@"error preparing statement"); 

我得到以下输出:

Result: 100 
Result: 100 
Result: 5 

这不是第一个程序我已经在那里我”我跑了多个选择,然后做了一个插入。任何想法为什么最后的结果是SQLITE_BUSY?我试过关闭数据库,并将cmd设置为零。

回答

1

我发现这个问题(我知道会当我击中后发生...)

我发布的代码是从不同的程序调用。除此之外,所有15条陈述均已完成定稿。我最终确定了这一点,并发挥了作用。我不明白为什么我可以运行7选择,1更新,7更多的选择没有完成#4,但它给第二个过程中的错误...

+0

如果您的数据库处于WAL模式,写操作不会块读取,但会阻止其他写入,因此可能是原因。 – 2014-09-25 18:21:56