Привет! Сегодня расскажу как читать данные из sqlite базы с помощью Room и RxJava
Перед началом добавьте необходимые зависимости в build.gradle:
// Room components implementation "android.arch.persistence.room:runtime:$rootProject.roomVersion" implementation "android.arch.persistence.room:rxjava2:$rootProject.roomVersion" annotationProcessor "android.arch.persistence.room:compiler:$rootProject.roomVersion" androidTestImplementation "android.arch.persistence.room:testing:$rootProject.roomVersion" // Lifecycle components implementation "android.arch.lifecycle:extensions:$rootProject.archLifecycleVersion" implementation "android.arch.lifecycle:reactivestreams:$rootProject.archLifecycleVersion" annotationProcessor "android.arch.lifecycle:compiler:$rootProject.archLifecycleVersion" // Rx implementation 'io.reactivex.rxjava2:rxandroid:2.1.0' implementation 'io.reactivex.rxjava2:rxjava:2.2.1'
Теперь можем взять базу из assets и определить класс Dao для данных:
@Database(entities = {Verse.class}, version = 1, exportSchema = false) public abstract class MyRoomDatabase extends RoomDatabase { public abstract MyDataDao myDataDao(); private static MyRoomDatabase INSTANCE; static MyRoomDatabase getDatabase(final Context context) { if (INSTANCE == null) { synchronized (MyRoomDatabase.class) { if (INSTANCE == null) { INSTANCE = Room.databaseBuilder(context.getApplicationContext(), MyRoomDatabase.class, "data.sqlite3") // get db from assets .openHelperFactory(new AssetSQLiteOpenHelperFactory()) .build(); } } } return INSTANCE; } public void destroyInstance() { synchronized (MyRoomDatabase.class) { INSTANCE = null; } } } @Dao public interface MyDataDao { @Query("SELECT * from verses ORDER BY RANDOM() LIMIT 1") LiveData<Verse> getRandomVerse(); @Query("SELECT * from verses ORDER BY RANDOM() LIMIT 1") // same request Flowable<Verse> getRxRandomVerse(); }
Мне нравится как Room позволяет удобно получать Flowable и LiveData прямо из коробки.
Все что нужно — это предоставить запрос в аннотации.
Далее мы объявляем класс репозитория следующим образом:
class MyRepository(context: Context?) { private val mDataDao: MyDataDao private val db: MyRoomDatabase? = MyRoomDatabase.getDatabase(context) init { mDataDao = db!!.myDataDao() } fun getRxRandomVerse(): Flowable<Verse> { return mDataDao.getRxRandomVerse } fun getDb(context: Context?): MyRoomDatabase? { return db ?: MyRoomDatabase.getDatabase(context) } fun closeDb() { db?.close() } }
Наконец, получаем данные в презентере и активити:
class MainActivityPresenter { private var mRepository: MyRepository? = null fun attach(mainActivityView: MainActivityView, context: Context) { this.mainActivityView = mainActivityView this.mRepository = MyRepository(context) } fun getRandomVerse() { mainActivityView!!.showProgressBar() mRepository.getRxRandomVerse() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ verse -> mainActivityView!!.hideProgressBar() updateUI(verse?.toString()) }, { error -> mainActivityView!!.hideProgressBar() error.printStackTrace() }) } } class MainActivity : MainActivityPresenter.MainActivityView { ... override fun updateUI(verse: String) { textViewVerse.text = verse } ... }
Вот и все в общем-то. Достаточно просто и удобно. Работу этого кода в действии вы можете в моем новом приложении генератора случайных цитат священного писания.
Если у Вас есть вопросы и комментарии, пишите.