Привет! Сегодня расскажу как читать данные из 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
}
...
}
Вот и все в общем-то. Достаточно просто и удобно. Работу этого кода в действии вы можете в моем новом приложении генератора случайных цитат священного писания.
Если у Вас есть вопросы и комментарии, пишите.