2014-09-25 33 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