Странное * изменение символа с sqlite3_step (оператор) - PullRequest
0 голосов
/ 23 ноября 2010

С помощью этого кода я пытаюсь получить оператор SQL CREATE из sqlite_master для конкретной таблицы:

[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 (оператор) запускается снова, nameColumn и sqlColumn изменяют свои значения, хотя их больше не вызывают ?? !!.. ", что нормально.

Но когда программа подходит к предложению во время предложения, nameColumn изменяется на" index ", а sqlColumn на что-то непонятное, хотя цикл не повторяется.

Какэто может случиться?Что я делаю не так?

1 Ответ

1 голос
/ 23 ноября 2010

Вы не делаете ничего плохого.sqlite повторно использует буферы.Если вы хотите сохранить что-то, что вы получаете от этого, сделайте копию этого: значение указателя гарантируется только до следующего sqlite3_step или sqlite3_finalize.

Так что ваш обходной путь - это то, как вы должныобработайте это.

Из документации sqlite:

Возвращенные указатели действительны до тех пор, пока не произойдет преобразование типа, как описано выше, или до вызова sqlite3_step() или sqlite3_reset() или sqlite3_finalize().Пространство памяти, используемое для хранения строк и больших двоичных объектов, освобождается автоматически.Не передавайте возвращенные указатели sqlite3_column_blob(), sqlite3_column_text() и т. Д. В sqlite3_free().
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...