SQL параметризованные запросы в Android - PullRequest
5 голосов
/ 08 февраля 2012

Я просматривал, какие интерфейсы / классы существуют в Android для параметризованных запросов, и это немного беспорядок.

Может кто-нибудь прояснить, что является лучшим (и самым безопасным) среди:

  • с использованием SQLiteDatabase.query ()
  • с использованием SQLiteDatabase.rawQuery ()
  • с использованием SQLiteStatement
  • с использованием SQLiteQueryBuilder
  • с использованием compileStatement ()
  • с использованием managedQuery ()
  • с использованием ContentValues ​​
  • используя что-то еще, например ExecSQL ()

Может кто-нибудь объяснить, почему существует так много, в чем разница между ними и как лучше всего иметь параметры связывания для запросов?

1 Ответ

9 голосов
/ 08 февраля 2012

Я просматривал, какие интерфейсы / классы существуют в Android для параметризованных запросов, и это немного беспорядок.

Не совсем.

Может кто-то прояснить, что является лучшим (и самым безопасным) среди:

Нет, потому что вы не определили, как вы считаете, критерии для «лучшего».

с использованием SQLiteDatabase.query () использование SQLiteDatabase.rawQuery ()

Лично из них я использую rawQuery(), так как считаю его наиболее читабельным. ИМХО, query() больше для случаев, когда вы пытаетесь построить оператор SELECT из отдельных частей (например, имя таблицы, список столбцов), потому что, возможно, некоторые из них являются переменными (например, разные таблицы для разных пользователей). В конце дня они оба делают одно и то же. query() использует SQLiteQueryBuilder под крышками (см. Ниже).

с использованием SQLiteStatement используя compileStatement ()

Это одно и то же. SQLiteStatement - это то, что Java называет «классом». compileStatement() - это то, что Java называет «методом». Метод compileStatement() возвращает экземпляр класса SQLiteStatement.

SQLiteStatement обычно не так полезен для запросов, поскольку он не может возвращать полные наборы результатов, за исключением ответов в виде одного столбца / одной строки.

с использованием SQLiteQueryBuilder

Это еще один способ построения запроса из отдельных частей. Это полезно в тех случаях, когда несколько сторон могут решить, что входит в запрос, например, ContentProvider и потребитель этого ContentProvider. Помимо этого, однако, в конце концов, он выполняет rawQuery(). Следовательно, нет существенной разницы в результатах использования SQLiteQueryBuilder или использования rawQuery() напрямую.

с использованием managedQuery ()

Это устарело и не имеет отношения к SQLiteDatabase в любом случае.

с использованием ContentValues ​​

Это не имеет ничего общего с запросами к SQLiteDatabase.

Может кто-нибудь объяснить, почему существует так много

Некоторые выполняют разные роли, во многих случаях не имея ничего общего с запросами к SQLiteDatabase.

В отношении трех допустимых опций из вашего списка (rawQuery(), query() и SQLiteQueryBuilder) все они делают одно и то же: query() использует SQLiteQueryBuilder, а SQLiteQueryBuilder использует rawQuery(). Единственное отличие состоит в том, как устроен оператор SQL SELECT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...