Чтение и запись в Room

Решил ознакомиться с Room. Поискал в интернете уроки, понял основные принципы работы, кроме одного. А именно: как читать и записывать данные?

У меня есть экспериментальное приложение. Идея простая: пользователь вводит свой логин, имя и возраст и нажимает кнопку "Save", если ему надо сохранить информацию. Если же он её уже сохранял ранее и хочет её открыть, то он вводит свой логин и нажимает кнопку "Open", после чего поля с именем и возрастом заполняются ранее введенными данными. Единственная проблема: как это сделать?

Из главного потока сохранять или читать данные нельзя, что логично. Хотел в OnClickListener кнопки "Save" создать поток, записывающий данные в БД, а в OnClickListener кнопки "Open" создать поток, читающий данные из БД, но и так нельзя: операции чтения и записи должны происходить в одном потоке. AsyncTask c версии Android 11 - deprecated. Какие есть способы для решения задачи? Заранее спасибо.


Ответы (1 шт):

Автор решения: tosh17

Решений тьма, можно как написал pavloff

Гугл в своих туториалах использует класс Executor для реализации асинхронной записи. При чтении используется LiveData, это асинхронная операция и дополнительно запускать ее в асинхронном потоке не требуется

Если используете Kotlin то корутины, для них есть прекрасное расширение Можно rx-java так же использовать для асинхроного чтение] и записи Ну и на худой конец, если вы пока не освоили ни одного из инструментов, для асинхронной работы, но потрогать room очень хочется то проверку на главный поток можно отключить - добавить в билдер

    var db = Room.databaseBuilder(
        applicationContext,
        AppDb::class.java, "database")
        .allowMainThreadQueries() //отключает проверку
        .build()

После этого можете записывать и читать на любом потоке. Но лучше так не делайте и разберитесь с асинхронной работой

→ Ссылка