2015-05-01 128 views
1

我需要在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); 
    } 


} 
+0

您正在更新數據庫過於頻繁,這就是爲什麼它會導致問題。 您可以保留一個存儲doubleTap計數的本地變量。 並在用戶離開該屏幕時更新數據庫。 –

+3

而不是在任意後臺隊列上運行數據插入,創建單個後臺隊列並使用該一個隊列進行所有數據庫更新。這將序列化所有更新。另外,爲什麼每次打開和關閉數據庫?應用程序啓動時打開數據庫一次,並始終使用相同的連接。 – rmaddy

+2

另外,爲什麼關閉數據庫,如果它不打開?爲什麼要完成準備好的聲明,即使它沒有準備好? – rmaddy

回答

0

您所使用的調度隊列是併發隊列,而不是一系列的隊列。結果是,一次對dB提出的請求太多了。如果您更改代碼以使用dispatch_barrier_async,則應該沒問題,但我從未在系統隊列中使用它。

此外,你的代碼可以使用一些清理。 try是不必要的,因爲這段代碼不會拋出異常。與Java相反,Objective Chicago很少拋出異常。

最後,您可以考慮使用ObjectiveC SQLite包裝器,如FMDatabase。它清理了很多東西。

+0

感謝您的回覆 – SampathKumar