我需要在db中存儲用戶doubleTap計數。它的工作正常。 如果我正在做非常快的雙擊插入,問題將出現(數據庫被鎖定,沒有這樣的表:和內存不足)。如何處理這個問題?iOS中的Sqlite插入問題
由於提前
我想這一點,供參考:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^(void)
{
@try {
if([self openAppDatabase] == YES) //If DB open success...
{
sqlite3_stmt *statement = nil;
NSString *queryString = [NSString stringWithFormat:@"INSERT INTO %@ (%@,%@) values (?,?)",Tables_Count,lkt_TO,ttt_TIME];
BOOL prepareStatementResult = sqlite3_prepare_v2(databaseObj, [queryString UTF8String], -1, &statement, NULL);
if(prepareStatementResult == SQLITE_OK) {
sqlite3_bind_text(statement, 1, [contactNo UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(statement, 2, [sentDate UTF8String], -1, SQLITE_TRANSIENT);
if (sqlite3_step(statement) != SQLITE_DONE) {
DLog(@"Can't insert ---- Error");
}
}
else {
// In the database cannot be opened then show the error message on the debugger.
DLog(@"%s", sqlite3_errmsg(databaseObj));
}
// Release the compiled statement from memory.
sqlite3_finalize(statement);
}
[self closeAppDatabase]; //If DB not opened will close it here...
}
@catch (NSException *exception) {
DLog(@"@Exception --- %@",exception.reason);
}
}
您正在更新數據庫過於頻繁,這就是爲什麼它會導致問題。 您可以保留一個存儲doubleTap計數的本地變量。 並在用戶離開該屏幕時更新數據庫。 –
而不是在任意後臺隊列上運行數據插入,創建單個後臺隊列並使用該一個隊列進行所有數據庫更新。這將序列化所有更新。另外,爲什麼每次打開和關閉數據庫?應用程序啓動時打開數據庫一次,並始終使用相同的連接。 – rmaddy
另外,爲什麼關閉數據庫,如果它不打開?爲什麼要完成準備好的聲明,即使它沒有準備好? – rmaddy