Комната LiveData не срабатывает при изменении базы данных - PullRequest
0 голосов
/ 08 октября 2019

Я читаю базу данных комнаты, введенную с помощью Dagger, и возвращаю LiveData в моем DAO. Сначала я читаю список, когда создается экземпляр фрагмента, и он хорошо читается, но когда я изменяю базу данных, наблюдатель не увольняется, почемуэто что?

DatabaseModule

@Module
class DatabaseModule {
    @Singleton
    @Provides
    fun provideDatabase(context: Context): AppDatabase {
        return Room.databaseBuilder(
            context,
            AppDatabase::class.java,
            "CargamosDriver"
        )
            .fallbackToDestructiveMigration()
            .build()
    }

    @Singleton
    @Provides
    fun operationsDao(appDatabase: AppDatabase): OperationsDAO {
        Timber.d("Database Hash: ${appDatabase.hashCode()}")
        return appDatabase.getOperationsDao()
    }
}

OperationsDAO

@Dao
interface OperationsDAO {

    @RawQuery
    fun updatePrice(query: SupportSQLiteQuery): Any

    @Query("SELECT * FROM OPERATIONS")
    fun getOperationsFromTodayAsync(): LiveData<List<OperationPersistence>>

}

ServicesFragmentViewModel

class ServicesFragmentViewModel @Inject
constructor(
    val operationsDAO: OperationsDAO
) : BaseViewModel() {
    var noServices: Boolean = true

    val routes: LiveData<List<Route>> =
        Transformations.map(operationsDAO.getOperationsFromTodayAsync()) { operations ->
            val routes = arrayListOf<Route>()
            val routesMap = hashMapOf<Long, ArrayList<Location>>()

            for (operation in operations) {
                val location = Location(
                    id = operation.id,
                    contactName = operation.contact_name,
                    fullAddress = "",
                    routeID = operation.route,
                    items = operation.items,
                    lat = operation.lat,
                    lng = operation.lng,
                    phone = operation.contact_phone,
                    domain = "",
                    state = operation.state,
                    created = operation.created,
                    price = operation.price
                )

                routesMap.getOrPut(operation.route) {
                    arrayListOf()
                }

                routesMap[operation.route]?.add(location)
            }

            routesMap.forEach { (routeID, operations) ->
                val route = Route(
                    routeID = routeID,
                    ongoing = false,
                    locations = operations
                )
                routes.add(route)
            }

            routes
        }

    @WorkerThread
    fun updatePrice() {
        GlobalScope.launch(Dispatchers.Main) {
            withContext(Dispatchers.IO) {
                var random: Long = (0..100).random().toLong()

                val query = SimpleSQLiteQuery(
                    "UPDATE OPERATIONS SET price = ${random}"
                )
                operationsDAO.updatePrice(query)
            }
        }
    }
}

И в моем фрагменте я наблюдаю такие данные:

viewModel.routes.observe(this,
            Observer {
                viewModel.noServices = it.isEmpty()
                mainViewModel.switchState.value = mainViewModel.switchState.value
                adapter.addAllItems(it)
            })

Даже если я наблюдаю LiveData комнаты непосредственно из моего фрагмента без карты Tranformations.map, как это:

viewModel.operationsDAO.getOperationsFromTodayAsync().observeForever(
            Observer {
                Timber.d("DATABASE CHANGED")
            }
        )

она запускается только один раз, когда создается экземпляр фрагмента, а затем не запускаетсяне срабатывает, когда я изменяю базу данных, и я точно знаю, что база данных была изменена, потому что, если я проверю базу данных вручную, значение изменится, и если я перезагрузлю фрагмент, список заполнится новым значением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...