SQLiteQueryBuilder.buildQuery не использует selectArgs? - PullRequest
1 голос
/ 20 марта 2010

Хорошо, я пытаюсь запросить базу данных sqlite. Я пытался быть хорошим и использовал метод запроса SQLiteDatabase и передавал значения в параметре selectArgs, чтобы убедиться, что все правильно экранировано, но это не сработало. Я никогда не получал никаких строк (без ошибок).

Я начал интересоваться SQL-кодом, который он генерировал, поэтому я немного поэкспериментировал и обнаружил SQLiteQueryBuilder (и, очевидно, переполнение стека плохо обрабатывает ссылки с круглыми скобками, поэтому я не могу ссылка на якорь для метода buildQuery), который, как я предполагаю, использует ту же логику для генерации оператора SQL. Я сделал это:

  SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
  builder.setTables(BarcodeDb.Barcodes.TABLE_NAME);

  String sql = builder.buildQuery(new String[] { BarcodeDb.Barcodes.ID, BarcodeDb.Barcodes.TIMESTAMP, BarcodeDb.Barcodes.TYPE, BarcodeDb.Barcodes.VALUE },
    "? = '?' AND ? = '?'",
    new String[] { BarcodeDb.Barcodes.VALUE, barcode.getValue(), BarcodeDb.Barcodes.TYPE, barcode.getType()},
    null, null, null, null);

  Log.d(tag, "Query is: " + sql);

SQL, который регистрируется в этот момент:

SELECT _id, timestamp, type, value FROM barcodes WHERE (? = '?' AND ? = '?')

Однако вот что сказано в документации по SQLiteQueryBuilder.buildQuery о параметре selectAgs:

Вы можете включить? S в выбор, который будут заменены значениями из selectionArgs, для того чтобы они появляются в выборе.

... но это не работает. Есть идеи?

Ответы [ 2 ]

8 голосов
/ 20 марта 2010

В документе для SQLiteQueryBuilder.buildQuery также говорится: «Значения будут связаны в виде строк». Это говорит мне, что он делает прямую вещь, которая пишет SQL, оставляя? маркеры параметров на месте, это то, что вы видите, и привязка selectArgs в качестве входных параметров.

? заменяются на sqlite при выполнении запроса, а не в строке SQL. Первая строка в массиве будет идти там, где вы видите первую? И т. Д., Когда запрос действительно выполняется. Я ожидал бы, что зарегистрированный SQL все еще будет иметь? маркеры.

Возможно, ваш запрос не выполнен, потому что вы цитируете?. Например, не используйте WHERE ID = '?', Просто используйте WHERE ID =? И убедитесь, что selectArgs является строкой, удовлетворяющей запросу.

2 голосов
/ 20 марта 2010

Две вещи:

  1. Подстановка ? не будет выполняться в этот момент, а только тогда, когда запрос выполняется SQLiteDatabase.
  2. Из того, что я видел, подстановка ? работает только для правой части предложений сравнения. Например, некоторые люди пытались использовать ? для названия таблицы, которая взорвалась. Я не видел, чтобы кто-нибудь пытался использовать ? для левой части предложения сравнения, поэтому это может сработать - я просто предупреждаю вас, что это может не сработать.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...