奇怪的* char更改与sqlite3_step(语句)

时间:2010-11-23 16:56:20

标签: iphone sqlite

使用此代码,我试图从sqlite_master获取特定表的SQL CREATE语句:

[SQLStatement setString:@“SELECT name,sql FROM sqlite_master WHERE 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(statement),nameColumn和sqlColumn会改变它们的值虽然没有被再次调用?? !!

nameColumn为firt分配了表名,sqlColumn分配了“CREATE TABLE ...”语句,这没关系。

但是当程序来到句子时,nameColumn会更改为“index”而sqlColumn会更改为不可理解的内容,尽管不会重复循环。

这怎么可能发生?我做错了什么?

1 个答案:

答案 0 :(得分:1)

你没有做错任何事。 sqlite重用缓冲区。如果你想保留你从中获得的东西,请复制它:指针的值只保证到下一个sqlite3_stepsqlite3_finalize

所以你的解决方法就是你应该如何处理这个问题。

来自sqlite docs:

返回的指针有效,直到如上所述发生类型转换,或直到调用sqlite3_step()sqlite3_reset()sqlite3_finalize()为止。用于保存字符串和BLOB的内存空间会自动释放。不要将返回sqlite3_column_blob()sqlite3_column_text()等指针传递给sqlite3_free()