Лучший способ сделать это - отследить скомпилированный оператор.Я нашел решение с помощью этого вопроса:
Команда sqlite3_trace запускает обратный вызов, который вам нужно кодировать самостоятельно.Как только трассировка будет включена, она будет выполняться для остальной части программы.
У меня есть все мои процедуры доступа к базе данных в одном классе, и я использовал это как функцию обратного вызова (это Cфункция, а не метод).
void traceCallback( void* udp, const char* sql )
{
printf("{SQL} [%s]\n", sql);
}
Я включил трассировку в методе инициализации базы данных: он включается при открытии базы данных.
-(void)initializeDatabase
{
NSString *path = [self createEditableCopyOfDatabaseIfNeeded];
// open the db
if (sqlite3_open([path UTF8String], &db) == SQLITE_OK)
sqlite3_trace(db, traceCallback, NULL);
else {
// error - cleanup
sqlite3_close(db);
NSLog(@"Error opening db");
NSLog(@"Path: %@",path);
}
}
Это превратит SQLоператор со связанными переменными в строку.Из этого:
const char *sql2 = "select a.key, b.key from words a left outer join known_words b on a.key = b.word_id where a.word_foreign = :word_foreign";
Для этого:
{SQL} [select a.key, b.key from words a left outer join known_words b on a.key = b.word_id where a.word_foreign = 'bak.']