簡體   English   中英

sqlite3 - iOS - 數據庫被鎖定

[英]sqlite3 - iOS - database is locked

我正在為ipad開發一個應用程序,我正在使用sqlite句子(選擇,更新,插入,刪除)。

我在開頭打開(sqlite3_open)數據庫,在每個句子的末尾關閉(sqlite3_close)。 但有時候我有“數據庫被鎖定”的消息。

我不知道我能做些什么來解決這個問題。

謝謝,抱歉這個小信息。

如果我沒有弄錯的話,sqllite的問題在於你一次只能訪問一次。 如果您有多個線程,則可以在這種情況下運行。 例:

在線程t1上運行method1(訪問數據庫)。 在x秒后在線程t2上運行method2(訪問數據庫)。

如果method1未在那些x秒內完成,則兩個方法將同時訪問它。 而且,正如我所說,我知道sqllite不支持這一點。

您應該嘗試標記數據庫的使用情況,如果要訪問它但它正在使用中,請在x秒后再試一次。 像這樣:

- (void) generalMethodThatUsesDatabses
{
    if(databaseIsUsed)
    {
         [self performSelector:@selector(generalMethodThatUsesDatabses) withObject:nil afterDelay:5];
          return;
    }

    databaseIsUsed = TRUE;   //global bool variable


    //your code here

    databaseIsUsed = FALSE;

}

希望這可以幫助。 干杯!

您可能在使用相同的模擬器之前打開了數據庫。 要結束對數據庫的所有操作並釋放所有資源,您始終必須使用兩個(!)語句:

sqlite3_finalize(statement);
sqlite3_close(database);

解決此問題的一種好方法是將其包裝到C ++庫中。 這樣,您就可以在堆棧上創建庫包裝器。 這意味着在函數超出范圍的那一刻,您可以在析構函數中關閉連接。

(注意我使用Objective-C的引用計數)

例如:

NSArray* ScoreBoard::getAllScores()
{ 
      ScoreBoard::ensureExistingTable();

      //Stack allocated
      SqliteWrapper sqlite("Scores.sqlite");

     NSArray* result = sqlite.RunQuery("SELECT * FROM Scores ORDER BY ID DESC");

     return result;
     //after this, the sqlite destructor is called
}

Objective-C編譯器允許您合並C ++是非常好的。 它非常有用。

 void SqliteWrapper::Close()
 {
     sqlite3_close(db);
 }

正如文森特指出的那樣,你必須完成聲明。 如果要保持連接打開,請在每個語句后使用finalize。 丟棄連接時關閉連接。

這種方法適合我。

它用於三個1.isert 2.update 3.刪除。

-(NSMutableArray *)resultSet
-(void)insertWithTitle:(NSString *)title Body:(NSString *)body
-(BOOL)updateAtIndex:(int)index Title:(NSString *)title Body:(NSString *)body

NSMutableArray *result = [[[NSMutableArray alloc] initWithCapacity:0] autorelease];

FMResultSet *rs = [db executeQuery:[self SQL:@"SELECT * FROM %@" inTable:TABLE_NAME]];
while ([rs next]) {
    Record *tr = [[Record alloc] initWithIndex:[rs intForColumn:@"id"]
                                         Title:[rs stringForColumn:@"title"]
                                          Body:[rs stringForColumn:@"body"]];
    [result addObject:tr];
    [tr release];
}

[rs close];

2 ....

return result;
[db executeUpdate:[self SQL:@"INSERT INTO %@ (title, body) VALUES (?,?)" inTable:TABLE_NAME], title, body];
if ([db hadError]) {
    NSLog(@"Err %d: %@", [db lastErrorCode], [db lastErrorMessage]);

刪除記錄:

BOOL success = YES;
[db executeUpdate:[self SQL:@"DELETE FROM %@ WHERE id = ?" inTable:TABLE_NAME], [NSNumber numberWithInt:index]];
if ([db hadError]) {
    NSLog(@"Err %d: %@", [db lastErrorCode], [db lastErrorMessage]);
    success = NO;
}
return success;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM