2014-07-24 36 views
0

我有一些代碼將票據添加到數據庫。我可以添加就好,但是當我嘗試更新數據庫中的現有票證時,我只能更新一次,然後每次更新都失敗。如果我重新啓動應用程序,那麼在失敗之後,我可以再次更新一次和每次更新嘗試。有人可以幫助我找到造成這種情況的原因。這是我添加/更新數據庫的代碼。Xcode Sqlite更新聲明只能工作一次

sqlite3_stmt *statement; 
const char *dbpath = [_databasePath UTF8String]; 

if (sqlite3_open(dbpath, &_ticketDB) == SQLITE_OK) 
{ 

//first I check to see if ticket already exists 
NSString *insertSQL = [NSString stringWithFormat:@"SELECT * FROM tickets WHERE ticketnum = \'%@\'", globalData.ticket]; 
int rc = sqlite3_prepare_v2(_ticketDB, [insertSQL UTF8String], -1, &statement, nil); 
if (rc == SQLITE_OK) { 
      //Based on if ticket exists, I either update or insert new row 
      if (sqlite3_step(statement) == SQLITE_ROW) { 
       insertSQL = [NSString stringWithFormat:@"UPDATE tickets SET shippername = \'%@\' WHERE ticketnum = \'%@\'", globalData.shipperName, globalData.ticket]; 
      } 
      else{ 
       insertSQL = [NSString stringWithFormat:@"INSERT INTO TICKETS (ticketnum, shippername) VALUES (\"%@\", \"%@\")", globalData.ticket, globalData.shipperName]; 

      } 
     } 

     const char *insert_stmt = [insertSQL UTF8String]; 
     sqlite3_prepare_v2(_ticketDB, insert_stmt, -1, &statement, NULL); 
     if (sqlite3_step(statement) == SQLITE_DONE) 
     { 
      NSLog(@"Added/Updated"); 

     } else { 
      NSLog(@"Failed to add/update ticket to db"); 
     } 
     sqlite3_finalize(statement); 
     sqlite3_close(_ticketDB); 
    } 
+0

更新:在我更新數據庫我可以添加新行就好,多達我想一排。但在更新其中一行之後,我無法再在此之後更新或添加。更新語句必須執行一些操作,導致我的db在執行一次後無法訪問。 – adrian1kat

+1

你永遠不會最終確定你的「SELECT」語句,而是使用同一個變量來準備另一個語句來存儲它。舊的語句沒有自動完成,它只是在內存中丟失,可能是因爲更新這樣的行而持有「UPDATE」語句,因爲該行被「SELECT」語句鎖定。在'sqlite3_prepare_v2(_ticketDB,insert_stmt,-1,&statement,NULL)'前加一個'sqlite3_finalize(statement)';' – Googie

+0

謝謝你Googie!這工作。我花了太多時間試圖弄清楚這一點。 – adrian1kat

回答

1

[從Googie的評論:]

你永遠不會完成你的「SELECT」語句,而是你準備使用同樣的變量來存儲它的另一個說法。舊的語句沒有自動完成,它只是在內存中丟失,可能是因爲更新這樣的行而持有「UPDATE」語句,因爲該行被「SELECT」語句鎖定。

只需多加一個

sqlite3_finalize(statement); 

sqlite3_prepare_v2(_ticketDB, insert_stmt, -1, &statement, NULL);