[英]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.