Я просматривал, какие интерфейсы / классы существуют в 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
.