2015-06-08 60 views
0

我試圖插入兩個新列到我的SQLite數據庫,如果列不可用。一切都很好,並且「添加」BOOL是YES。但是這些專欄不在我的桌子上!在iOS中添加新列到SQLite

-(void)checkColumnExists 
{ 
    NSString *dbPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"movieData.sqlite"]; 
    const char *dbpath = [dbPath UTF8String]; 
    sqlite3 *contactDB; 

    sqlite3_open(dbpath, &contactDB); 

    sqlite3_stmt *selectStmt; 

    const char *sqlStatement = "SELECT borrowMovie from myMovies"; 
    if(sqlite3_prepare_v2(contactDB, sqlStatement, -1, &selectStmt, NULL) != SQLITE_OK){ 
     //ALTER TABLE {tableName} ADD COLUMN COLNew {type}; 
     const char *sqlStatement1 = "ALTER TABLE myMovies ADD COLUMN borrowMovie TEXT, borrowDate TEXT"; 
     BOOL added = sqlite3_prepare_v2(contactDB, sqlStatement1, -1, &selectStmt, NULL); 
    } 
} 
+1

所以,你準備語句,然後....什麼。您還沒有閱讀過如何正確使用sqlite3。 – Droppy

+0

是的,這是問題,你有鏈接或遵循什麼? @Droppy – Rudi

+1

這裏是[一](http://www.wassen.net/sqlite-c.html)。我只是簡單地搜索「使用sqlite3_prepare_v2」。 – Droppy

回答

1

你需要調用sqlite3_step()至少一次,sqlite3_prepare_v2()後。這是實際執行查詢的功能。如果您正在讀取一些SELECT結果,則需要多次(對於每行)調用該函數,但是如果您只是執行沒有結果的查詢,則需要完全單一的調用。

+1

如果sqlite3_prepare_v2()返回一個錯誤(在這種情況下它會),你必須*不*調用'sqlite3_step()'。 –

0

好吧,我發現了問題:

  1. 正如@Droppy說,我剛準備好的語句,然後什麼都沒有。

  2. 由於@Googie說,我必須使用sqlite3_step()至少一次。

  3. 我不能一次添加多個列,我必須逐個添加它們。

因此代碼,

NSString *updateSQL = [NSString stringWithFormat: @"ALTER TABLE myMovies ADD COLUMN borrowMovie TEXT"]; 
     // 
     const char *update_stmt = [updateSQL UTF8String]; 
     sqlite3_prepare_v2(database, update_stmt, -1, &statement, NULL); 

     if(sqlite3_step(statement)==SQLITE_DONE) 
     { 
}