2010-11-23 5 views
0

奇妙char *型の変化私はSQLは、特定のテーブルのためにsqlite_masterからCREATE文を取得しようとしている。このコードで

[SQLStatementのsetStringの: "@する名前を選択し、sqlite_masterからSQL WHEREタイプ= 'table' AND name = '"];
[SQLStatement appendString:tableName]; [SQLStatement appendString:@ "'"];

int dbrc; 
const char *charSQLStatement = [SQLStatement UTF8String]; 
sqlite3_stmt *statement = nil; 
dbrc = sqlite3_prepare_v2 (dbHandleSQLite, charSQLStatement, -1, &statement, NULL); 
const char *nameColumn,*sqlColumn; 
dbrc = sqlite3_step (statement); 
NSString *tempString; 
do { 
    nameColumn = sqlite3_column_text(statement,0); 
    sqlColumn = sqlite3_column_text(statement,1); 
    NSLog(@"%s",nameColumn); 
    NSLog(@"%s",sqlColumn); 
    tempString = [NSString stringWithCString:sqlColumn encoding:NSASCIIStringEncoding]; 
} while (sqlite3_step(statement) == SQLITE_ROW); 
sqlite3_finalize (statement); 

NSLog(@"%s",nameColumn); 
NSLog(@"%s",sqlColumn); 

do-whileループは1回だけ実行されます。 tempStringに値を代入して割り当てるための小さな回避策を作ったことが分かります。 理由は、sqlite3_step(statement)が再度実行された場合、nameColumnとsqlColumnは再び呼び出されませんが、それらの値が変更されるからです。

nameColumnにはテーブルの名前が割り当てられており、sqlColumnには "CREATE TABLE ..."ステートメントが割り当てられています。これは正常です。

whileプログラムがwhile文になると、nameColumnが "index"に変更され、sqlColumnが理解できないものに変更されますが、ループは繰り返されません。

どうすればいいですか?私は間違って何をしていますか?

答えて

1

あなたは間違ったことはしていません。 sqliteはバッファを再利用します。ポインタの値は、次のsqlite3_stepまたはsqlite3_finalizeまで保証されています。

これを処理する方法があなたの回避策です。 SQLiteのドキュメントから

:上記、またはsqlite3_step()又はsqlite3_reset()又はsqlite3_finalize()まで呼ばれるようなタイプの変換が起こるまで戻さ

ポインタが有効です。文字列とBLOBを保持するために使用されるメモリ空間は自動的に解放されます。 sqlite3_column_blob()sqlite3_column_text()などのポインタを sqlite3_free()に渡さないでください。
+0

ありがとうございます!これは明らかです。 – mbpro

+1

質問を閉じるには、答えを受け入れるべきです。 :) –

関連する問題

 関連する問題