2012-01-19 8 views
0

は、誰もがこのコードスニペットで私を助けることができます:それはwhileループに入らない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ループを削除し、 try-catchブロック内のコードを囲み、私はこの例外を取得した場合:

+[NSString stringWithUTF8String:]: NULL cString 
+0

これは(または他の)問題の原因ではありませんが、 'sqlite3_finalize'で破壊する前に' sqlite3_reset'で文をリセットする必要はありません。 – Borodin

答えて

2

sqlite_stepループは一方で、更新ステートメントには不適切です。

sqlite.orgのドキュメントから:

sqlite3_step()このルーチンは以前sqlite3_prepare()インタフェースによって作成されたプリペアドステートメント を評価するために使用されます。 ステートメントは、 の結果の最初の行が使用可能になるまで評価されます。 2行目の結果に進むには、もう一度 sqlite3_step()を呼び出します。 ステートメントが完了するまでsqlite3_step()を呼び出し続けます。 結果を返さない文(例: INSERT、UPDATE、またはDELETE文)は、 を呼び出して完了し、sqlite3_step()が呼び出されます。

戻り値sqlite_stepを確認してください。 SQLITE_ROWではなく、SQLITE_DONEのようになります。

+0

@kumar?答えを受け入れる? – Mundi

関連する問題