2012-01-19 38 views
0

誰能幫我這個代碼片段:爲什麼我不能在SQLite中更新語句?

-(void) updateData:(NSString*)value1:(NSString*)value2 
{ 
    sqlite3* database; 
    databaseName = @"AppDB.sqlite"; 
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDir = [documentPaths objectAtIndex:0]; 
    databasePath = [documentsDir stringByAppendingPathComponent:databaseName]; 

    int databaseReturnCode = sqlite3_open([databasePath UTF8String], &database); 
    if(databaseReturnCode == SQLITE_OK) { 

    sqlite3_stmt *updateStmt; 
    const char *sql = "update PersonalInfo Set FirstName = ?,LastName = ? Where id = '1'"; 
    //sqlite3_prepare_v2(database, sql, -1, &updateStmt, NULL); 
    sqlite3_prepare(database, sql, -1, &updateStmt,nil); 

    sqlite3_bind_text(updateStmt, 1, [value1 UTF8String], -1, SQLITE_TRANSIENT); 
    sqlite3_bind_text(updateStmt, 2, [value2 UTF8String], -1, SQLITE_TRANSIENT); 


    printf("Update PersonalInfo| error or not an error? : %s\n", sqlite3_errmsg(database)); 

    while(sqlite3_step(updateStmt) == SQLITE_ROW) 
    { 
     NSString *aFirstName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(updateStmt, 1)]; 
     NSString *aLastName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(updateStmt, 2)]; 


     ProfileInfo *profile = [[ProfileInfo alloc]initWithFirstName:(NSString*)aFirstName LastName:(NSString*)aLastName]; 
     [personalInfo addObject:profile]; 
     [profile release]; 
    } 
     sqlite3_reset(updateStmt); 
     sqlite3_finalize(updateStmt); 
    } 

} 
    sqlite3_close(database);  
} 

它不會進入while循環。 但是,如果我去掉while循環和 在try-catch塊包圍的代碼,我得到這個異常:

+[NSString stringWithUTF8String:]: NULL cString 
+0

這不是造成這個(或任何其他)問題的原因,但在用'sqlite3_finalize'銷燬它之前,用'sqlite3_reset'重置語句是沒有意義的。 – Borodin

回答

2

sqlite_step while循環是不恰當的更新語句。

從文檔在sqlite.org:

sqlite3_step()這個程序是用來評估已經由sqlite3_prepare()接口事先創建一個準備好的聲明 。 該語句的評估結果爲第一行 結果可用。要前進到第二行結果,請再次調用 sqlite3_step()。繼續調用sqlite3_step(),直到 語句完成。 不返回結果的語句(例如: INSERT,UPDATE或DELETE語句)在調用sqlite3_step()的單個 上運行完成。

檢查您的返回值sqlite_step。它應該是像SQLITE_DONE而不是SQLITE_ROW

+0

@kumar?接受答案? – Mundi

相關問題