Как работать с данными через ContentResolver?

Посмотреть в Telegram: @AndroidSobes/40
ContentResolver имеет методы аналогичные CRUD API, а именно insert(), query(), delete(), update().

Все четыре метода принимают первым параметром объект класса Uri, который позволяет определить какой ContentProvider будет использован.

Метод query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) – аналогичен запросу SELECT в SQL и используется для получения данных.
Разберем параметры этого метода:

projection – массив имен колонок таблицы, которые будут возвращены в результате запроса.

selection – аналогичен WHERE в SQL. Задает условие, по которому выбираются данные из таблицы, например: "_id = ?".

selectionArgs – массив аргументов, которые используются в selection. Каждый знак вопроса в строке selection будет заменен на аргумент из массива selectionArgs.

sortOrder – аналогичен ORDER BY в SQL. Задает порядок, в котором будут возвращены результаты запроса. Например: "_id ASC" – по возрастанию значения id.

Пример использования метода query():

val projection = arrayOf("_id", "calendar_access_level", "visible")
val selection = "calendar_access_level = ? AND visible = ?"
val selectionArgs = arrayOf(Calendars.CAL_ACCESS_OWNER.toString(), "1")
val sortOrder = "_id ASC"

val result = query(Calendars.CONTENT_URI, projection, selection, selectionArgs, sortOrder)


CAL_ACCESS_OWNER – константа, определяющая уровень доступа owner.
"1" для параметра "visible" соответствует булевому значению true.

Такой код соответствует следующему SQL запросу:

SELECT id, calendar_access_level, visible, is_primary
FROM content://com.android.calendar/calendars
WHERE calendar_access_level=700 AND visible=1 AND is_primary=1
ORDER BY id ASC


Этот запрос возвращает все календари пользователя, к которым он имеет owner доступ. Далее id календарей могут быть использованы для получения или добавления событий в пользовательский календарь.
В предыдущем посте мы разобрали метод query(), который используется для получения данных через ContentResolver. Для изменения данных используются методы insert(), update(), delete().

insert(url: Uri, values: ContentValues) вставляет строку (row) в хранилище контент провайдера. Принимает вторым параметром объект ContentValues, который содержит пары ключ-значение. Ключ соответствует имени столбца (column) таблицы базы данных, в который записывается значение.
insert() возвращает Uri созданной строки или null, если строка не была создана.

update(uri: Uri, values: ContentValues, selection: String, selectionArgs: String[]) обновляет строки хранилища контент провайдера, которые соответствуют условиям selection и selectionArgs (как работают эти параметры смотрите в предыдущем посте). update() возвращает значение int – количество обновленных строк.

delete(url: Uri, selection: String, selectionArgs: String[]) удаляет строки, которые соответствуют условиям selection и selectionArgs, и возвращает количество удаленных строк.

Примеры использования этих методов.