2010-11-23 66 views
0

有了這個代碼,我試圖讓SQL創建SQLITE_MASTER聲明特定表:怪異*字符變化

[的SQLStatement了setString:@「選擇名稱,SQL FROM SQLITE_MASTER其中type = '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循環只運行一次。你可以看到,我已經做出了一個小的解決方法來獲得這個工作並賦值給tempString。 原因是因爲如果sqlite3_step(語句)再次運行,nameColumn和sqlColumn會更改它們的值,但不會再次被調用?!!

nameColumn是firt分配的表的名稱和sqlColumn被分配「CREATE TABLE ...」語句,這是正常的。

但是,當程序來到while句子時,nameColumn更改爲「index」,sqlColumn更改爲不可理解的東西,儘管循環不重複。

這是怎麼發生的?我究竟做錯了什麼?

回答

1

你沒有做錯什麼。 sqlite重用緩衝區。如果您想保留某些東西,請複製它:指針的值只能保證到下一個sqlite3_stepsqlite3_finalize

所以你的解決方法是你應該如何處理這個問題。

從源碼文檔:

返回的指針是有效的,直到如上述那樣,或直到 sqlite3_step()sqlite3_reset()sqlite3_finalize()被稱爲發生類型轉換。用於保存字符串和BLOB的內存空間會自動釋放。不要將返回的指針 sqlite3_column_blob(), sqlite3_column_text()等轉換爲 sqlite3_free()
+0

謝謝!這很清楚。 – mbpro 2010-11-23 19:13:02