В моем приложении я извлекаю некоторые данные из inte rnet и сохраняю их, используя комнату, чтобы потом их можно было отобразить, когда устройство не в сети. В моем поставщике данных я использую Observable.concat
, чтобы присоединить запрос к моей локальной базе данных и вызвать остальные API. Вот мой код:
class DataProvider(private val apiInterface: Api, private val database: Database) {
private val DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
fun getData(): Observable<List<Data>> {
return Observable.concat(database.dataDao().queryData().toObservable().doOnNext{ println("TEST SIZE ${it.size}") },
apiInterface.getData().doOnNext{
database.dataDao().deleteAllData()
database.dataDao().insertData(it) }
).map { it.map { data->
Event(
id = data.id,
title = data.title,
date = LocalDateTime.parse(
edata.date,
DateTimeFormatter.ofPattern(DATE_FORMAT)
)
)
}.sortedBy { it.date } }
}
}
@Database(entities = [DataResponse::class], version = 1)
abstract class Database : RoomDatabase() {
abstract fun dataDao(): DataDao
}
@Dao
interface DataDao {
@Query("SELECT * FROM dataresponse")
fun queryData(): Single<List<DataResponse>>
@Insert
fun insertData(data: List<DataResponse>)
@Query("DELETE FROM dataresponse")
fun deleteAllData()
}
interface Api {
@GET("getData")
fun getData(): Observable<List<DataResponse>>
}
@Entity
data class DataResponse(
@PrimaryKey val id: String,
@ColumnInfo(name = "title") val title: String,
@ColumnInfo(name = "date") val date: String
Здесь я сначала выбираю данные из базы данных, а затем из API. Если вызов API успешен, я сохраняю ответ в базе данных, но сначала очищаю таблицу. Когда устройство подключено к сети, все в порядке. Во время отладки я вижу, что onNext
в моем докладчике вызывается дважды, один раз из базы данных и один раз из вызова API. Но когда я выключаю inte rnet onNext
не называется cat all. Как вы можете видеть в моем поставщике данных при извлечении данных из базы данных, я добавил код .doOnNext{ println("TEST SIZE ${it.size}") }
для целей тестирования, и текст печатается в режиме онлайн, но докладчик по-прежнему не получает никаких данных. Это почему? Основная идея этого кода заключается в том, что, когда пользователь имеет доступ к приложению inte rnet, он будет отображать данные, полученные в произвольном порядке sh, но когда он не в сети, тогда должны отображаться данные, хранящиеся в базе данных. Что я здесь не так делаю?
Также я заметил, что это работает так, как задумано, пока я отлаживаю, но никогда, когда я запускаю приложение обычным способом