Невозможно sqlite3_bind_text
имя таблицы, потому что sqlite3_prepare_v2
сбои для подготовки оператора, такого как:
SELECT * FROM ? ;
Я предполагаю, что имя таблицы необходимо для парсинга оператора, таким образом, заключение в кавычки должно произойти прежде sqlite3_prepare_v2
.
Есть ли что-то как a sqlite3_quote_tablename
? Возможно, это уже существует под именем, которое я не могу распознать, но я ничего не могу найти в списке функций.
При использовании подготовленных операторов SQLite с параметрами параметр: "указывает местозаполнитель в выражении для буквального значения, которое заполняется во время выполнения "
Перед выполнением любого оператора SQL SQLite «компилирует» строку SQL в серию кодов операций , которые выполняются внутренней виртуальной машиной. Имена таблиц и столбцов, с которыми работает оператор SQL, являются необходимой частью процесса компиляции.
Вы можете использовать параметры для привязки «значений» к подготовленным операторам следующим образом:
SELECT * FROM FOO WHERE name=?;
А затем вызвать sqlite3_bind_text ()
для привязки строки gavinbeatty
к уже составленному заявлению. Однако эта архитектура означает, что вы не можете использовать такие параметры:
SELECT * FROM ? WHERE name=?; // Can't bind table name as a parameter
SELECT * FROM FOO WHERE ?=10; // Can't bind column name as a parameter
Если имя таблицы содержит недопустимые символы, вы можете заключить имя таблицы в двойные кавычки, как здесь.
sqlite> create table "test table" (id);
sqlite> insert into "test table" values (1);
sqlite> select * from "test table";
id
----------
1
Конечно, вам следует по возможности избегать использования недопустимых символов. Это усложняет разработку и почти всегда не требуется (IMO, единственный раз, когда это необходимо, - это когда вы наследуете проект, который уже выполнен таким образом, и он слишком велик, чтобы его можно было изменить).
Подход, который, как я видел, используется для обнаружения ошибок в UncoughtExcpingHandler
, заключается в том, чтобы записать данные сбоя в файл, а затем запустить обработку ошибок Activity
при перезапуске приложения на основе существования файла данных сбоя.
В зависимости от того, что вы хотите сделать Операция
, это может работать для вас.
Используйте его дважды, например \\
Если SQLite не принимает имена таблиц в качестве параметров, я не думаю, что есть решение вашей проблемы...
Учтите, что
Параметры, которым не присвоены значения с помощью sqlite3_bind (), рассматриваются как NULL.
поэтому в случае запроса имя таблицы будет иметь значение NULL, что, конечно, является недопустимым.