2012-11-02 77 views
1

我在iPhone應用程序中使用SQLITE3進行數據庫操作。在xcode4中插入SQLITE3

我在數據庫中有2個表,我想在不同情況下插入2個表。

我的問題是第一次插入操作正常工作。如果我嘗試插入到另一個表中,則該值將插入到最後插入的表中。

我對錶1的代碼是:

-(void)addToTable1 

{ 

    if(addStmt == nil) { 
     const char *sql = "insert into Table(T1_Name) Values(?)"; 
     if(sqlite3_prepare_v2(database, sqlCurrency, -1, &addStmt, NULL) != SQLITE_OK) 
      NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database)); 
    } 

    sqlite3_bind_text(addStmt, 1, [T1_Name UTF8String], -1, SQLITE_TRANSIENT); 

    if(SQLITE_DONE != sqlite3_step(addStmt)) 
     NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database)); 
    else 
     rowID = sqlite3_last_insert_rowid(database); 

    sqlite3_reset(addStmt); 
    sqlite3_close(database); 
} 

代碼表2是:

-(void)addToTable2 
{ 
    if(addStmt == nil) { 
     const char *sql = "insert into Table2(T2_Name) Values(?)"; 
     if(sqlite3_prepare_v2(database, sqlWeight, -1, &addStmt, NULL) != SQLITE_OK) 
      NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database)); 
    } 
    sqlite3_bind_text(addStmt, 1, [T2_Name UTF8String], -1, SQLITE_TRANSIENT); 

    if(SQLITE_DONE != sqlite3_step(addStmt)) 
     NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database)); 
    else 
     rowID = sqlite3_last_insert_rowid(database); 

    sqlite3_reset(addStmt); 
    sqlite3_close(database); 

} 

我沒有得到我任何線索,爲什麼它的發生。

回答

1

您釋放後必須將addStmt重置爲nil,否則if(addStmt == nil)檢查將阻止使用新語句。

此外,在關閉數據庫之前,您必須使用sqlite3_finalize而不是sqlite3_reset

+0

+1更好的是保持語句處理方法局部。 – trojanfoe

+0

我在AppDelegate.m中使用了sqlite3_finalize,它將在插入後立即執行。 –

+0

我得到了問題,這是因爲rowID = sqlite3_last_insert_rowid(database);所以使用新文件插入到table2是那種禮儀方式?或者還有其他更簡單的方法嗎? –