Как использовать подготовленные операторы в SQlite в Android?
android
sqlite
prepared-statement
пупено
источник
источник
Ответы:
Я постоянно использую подготовленные операторы в Android, это довольно просто:
источник
SQLiteStatement.bindXXX()
индекс основан на 1, а не на 0, как у большинства.Для подготовленных операторов SQLite в Android есть SQLiteStatement . Подготовленные операторы помогают повысить производительность (особенно для операторов, которые необходимо выполнять несколько раз), а также помогают избежать атак с использованием инъекций. См. Эту статью для общего обсуждения подготовленных операторов.
SQLiteStatement
предназначен для использования с операторами SQL, которые не возвращают несколько значений. (Это означает, что вы не будете использовать их для большинства запросов.) Ниже приведены несколько примеров:Создать таблицу
Этот
execute()
метод не возвращает значение, поэтому его можно использовать с CREATE и DROP, но он не предназначен для использования с SELECT, INSERT, DELETE и UPDATE, поскольку эти возвращаемые значения. (Но посмотрите на этот вопрос .)Вставить значения
Обратите внимание, что
executeInsert()
метод используется, а неexecute()
. Конечно, вы не хотели бы всегда вводить одни и те же данные в каждую строку. Для этого можно использовать привязки .Обычно вы используете подготовленные операторы, когда хотите быстро повторить что-то (например, INSERT) много раз. Подготовленный оператор делает так, что оператор SQL не нужно каждый раз анализировать и компилировать. Вы можете ускорить процесс еще больше, используя транзакции . Это позволяет применить все изменения сразу. Вот пример:
Ознакомьтесь с этими ссылками, чтобы получить более подробную информацию о транзакциях и ускорении вставки в базу данных.
Обновить строки
Это простой пример. Вы также можете применить концепции из раздела выше.
Удалить строки
Этот
executeUpdateDelete()
метод также может использоваться для операторов DELETE и был представлен в API 11. См. Эти вопросы и ответы .Вот пример.
Запрос
Обычно, когда вы запускаете запрос, вы хотите вернуть курсор с большим количеством строк. Однако это не то
SQLiteStatement
, для чего. Вы не запускаете с ним запрос, если вам не нужен только простой результат, например количество строк в базе данных, что вы можете сделать сsimpleQueryForLong()
Обычно вы запускаете
query()
метод SQLiteDatabase, чтобы получить курсор.См. Этот ответ для получения более подробной информации о запросах.
источник
clearBindings()
не просто устанавливает ихnull
(см. Исходный код ). Я смотрю на это как на очистку состояния, чтобы ничего не влияло на него из предыдущего цикла. Хотя, возможно, в этом нет необходимости. Буду рад, если кто-нибудь прокомментирует.Если вам нужен курсор при возврате, вы можете рассмотреть что-то вроде этого:
См. Этот фрагмент Genscripts, если вам нужен более полный. Обратите внимание, что это параметризованный SQL-запрос, поэтому, по сути, это подготовленный оператор.
источник
Пример с jasonhudgins не работает. Вы не можете выполнить запрос
stmt.execute()
и вернуть значение (илиCursor
).Вы можете предварительно скомпилировать только операторы, которые либо не возвращают никаких строк (например, оператор вставки или создания таблицы), либо одну строку и столбец (и используйте
simpleQueryForLong()
илиsimpleQueryForString()
).источник
Чтобы получить курсор, вы не можете использовать compiledStatement. Однако, если вы хотите использовать полностью подготовленный оператор SQL, я рекомендую адаптировать метод jbaez ... Использование
db.rawQuery()
вместоdb.query()
.источник