Android
131
Kotlin
val database = DbHelper(this).getWritableDatabase()
database.query(DbHelper.TABLE_NAME, null, null, null, null, null, null);
Заглянем внутрь, используя более реалистичный запрос:
Java
SqliteDatabase database = new DbHelper(this).getWritableDatabase();
database.query(
DbHelper.TABLE_NAME, //
Строка с именем таблицы
new String[] { DbHelper.COLUMN_ID }, // Массив
строк с именами столбцов
DbHelper.COLUMN_NAME + " = ?", // Строка для предложения WHERE
new String[] { "Request Data" }, // Массив строк со
значениями для WHERE
null, //
GROUP BY
null, // HAVING
null, //
ORDER BY
"1" //
Строка для предложения LIMIT
);
Kotlin
val database = DbHelper(context).writableDatabase
database.query(
DbHelper.TABLE_NAME, // Строка с именем таблицы
arrayOf(DbHelper.COLUMN_ID), // Массив строк с именами столбцов
DbHelper.COLUMN_NAME + " = ?", // Строка для предложения WHERE
arrayOf("Request Data"), // Массив строк со значениями для WHERE
null, // GROUP BY
null, // HAVING
null, // ORDER BY
"1" // Строка для предложения LIMIT
)
Предыдущий код фактически выполняет запрос
SELECT
ID
FROM
EVENTS
WHERE
NAME
=
\"Request
Dat
a\"
LIMIT
1
. Использование символа-заполнителя – распростра
-
ненный прием, помогающий предотвращать атаки типа «инъекция SQL».
Но где хранятся данные, полученные в случае
успешного выполнения за
-
проса? Он находится в наборе данных в памяти, доступ к которому можно по
-
лучить с помощью
Cursor
; метод
query
возвращает экземпляр
Cursor
. Например:
Java
Cursor cursor = database.query(DbHelper.TABLE_NAME, null, null, null, null,
null, null);
while (cursor.moveToNext()) {
Log.d("MyTag", "id: " + cursor.getString(0));
Log.d("MyTag", "name: " + cursor.getString(1));
Log.d("MyTag", "time: " + cursor.getLong(2));
}
cursor.close();
Kotlin
val cursor = database.query(DbHelper.TABLE_NAME, null, null, null, null,
null, null)
132
Хранение данных
while (cursor.moveToNext()) {
Log.d("MyTag", "id: " + cursor.getString(0))
Log.d("MyTag", "name: " + cursor.getString(1))
Log.d("MyTag", "time: " + cursor.getLong(2))
}
cursor.close()
Как видите, курсор позволяет получить доступ к столбцам по их индексам,
однако в классе
Cursor
есть также метод
getColumnByIndex
, возвращающий имя
столбца по его индексу, который можно использовать примерно так:
Java
cursor.getString(cursor.getColumnByIndex(DbHelper.COLUMN_ID));
Kotlin
cursor.getString(cursor.getColumnByIndex(DbHelper.COLUMN_ID))
Существует также масса других доступных API (и
сторонних механизмов
объектно-реляционного отображения [Object-Relational Mapping, ORM]), и воз
-
можности, которые предлагает поддержка SQL, ограничены только вашей фан
-
тазией. Если вы работаете над приложением, которое регулярно обращается
к базе данных, подумайте об использовании метода
compileStatement
, который
компилирует строку с запросом SQL и позволяет переопределять значения па
-
раметров при каждом вызове. Этот метод действует очень быстро и действи
-
тельно может улучшить воспринимаемую производительность при работе
с большими наборами данных.
На момент написания этой книги компания Google рекомендовала исполь
-
зовать библиотеку Room. Вот выдержка из документации для разработчиков
Android (
https://oreil.ly/rtG
9C
):
Все эти API (
SQLiteDatabase
и др.) обладают широкими возможностями, но
они довольно низкоуровневые и требуют много времени и сил для ис
-
пользования:
•
запросы SQL не проверяются во время компиляции.
При изменении
схемы данных вам придется изменить соответствующие SQL-запросы.
Этот процесс может занять много времени и чреват ошибками;
•
для преобразований между запросами SQL и объектами данных при
-
ходится писать много шаблонного кода.
По этим причинам мы настоятельно советуем использовать библиотеку
Room Persistence Library в роли слоя абстракции для доступа к информа
-
ции в базах данных SQLite из вашего приложения.
Do'stlaringiz bilan baham: