使用此代码,我试图从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会更改为不可理解的内容,尽管不会重复循环。
这怎么可能发生?我做错了什么?
答案 0 :(得分:1)
你没有做错任何事。 sqlite重用缓冲区。如果你想保留你从中获得的东西,请复制它:指针的值只保证到下一个sqlite3_step
或sqlite3_finalize
。
所以你的解决方法就是你应该如何处理这个问题。
来自sqlite docs:
返回的指针有效,直到如上所述发生类型转换,或直到调用sqlite3_step()
或sqlite3_reset()
或sqlite3_finalize()
为止。用于保存字符串和BLOB的内存空间会自动释放。不要将返回sqlite3_column_blob()
,sqlite3_column_text()
等指针传递给sqlite3_free()
。