首次安装应用程序时出现Room LiveData问题



我正在开发一个应用程序作为培训。目前,如果互联网连接可用,它会调用api并将数据加载到Room,同时UI会显示Room中的数据。它在第一次启动后运行良好,但当我将其安装到新的设备模拟器等或重新安装时。它在第一启动时不会显示数据,但如果我关闭它并再次打开它。它一直运行良好。我该如何解决这个问题?这是我的代码:

城市道

interface CityDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
suspend fun addCity(cityRm: CityRm)
@Query("SELECT * FROM city_table ORDER BY cId ASC")
suspend fun readAllCities(): List<CityRm>
}

CityRoomRepository

class CityRoomRepository(private val cityDao: CityDao) {
suspend fun readAllCities(): List<CityRm> {
return cityDao.readAllCities()
}
suspend fun addCity(cityRm: CityRm) {
cityDao.addCity(cityRm)
}
}

城市模型视图

class   CityRmViewModel (application: Application):AndroidViewModel(application) {
val allCities = MutableLiveData<List<CityRm>>()
private val cityDao = EventsDatabase.getEventsDatabase(application).cityDao()
private val eventDao = EventsDatabase.getEventsDatabase(application).eventDao()
private val cityRoomRepository: CityRoomRepository = CityRoomRepository(cityDao)
private val cityRepository: CityRepository = CityRepository()
private val eventRepository: EventListRepository = EventListRepository()
private val eventRoomRepository: EventsRoomRepository = EventsRoomRepository(eventDao)
init {
viewModelScope.launch(Main) {
val cities = cityRoomRepository.readAllCities()
allCities.value = cities
}
viewModelScope.launch(IO) {
try {
if (InternetConnectionCheck(application)) {
callCityApi(cityRepository, cityRoomRepository)
}
} catch (e: Exception) {
Log.e("internet connection check error ", e.toString())
}
}
viewModelScope.launch(IO) {
try {
if (InternetConnectionCheck(application)) {
callEventApi(eventRepository, eventRoomRepository)
}
} catch (e: Exception) {
Log.e("internet connection check error ", e.toString())
}
}
}
suspend fun loadData() {
val cities = cityRoomRepository.readAllCities()
allCities.value = cities
}

}

城市碎片

class citySelectionPage : Fragment() {
lateinit var cityViewModel: CityRmViewModel
private val cityAdapter = cityScPageAdapter(arrayListOf())

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_city_selection_page, container, false)
cityViewModel = ViewModelProvider(this).get(CityRmViewModel::class.java)
lifecycleScope.launch(Main) {
cityViewModel.loadData()
}
val recyclerView = view.cityPageRecycler
recyclerView.apply {
layoutManager = LinearLayoutManager(activity)
adapter = cityAdapter
}
observeViewModel()
return view
}
fun observeViewModel(){
cityViewModel.allCities.observe(viewLifecycleOwner, { cities ->
cities?.let {
cityAdapter.updateCities(it)
}
})
}
}

城市适配器

class cityScPageAdapter(var myCities: ArrayList<CityRm>) :
RecyclerView.Adapter<cityScPageAdapter.cityScPageViewHolder>() {

fun updateCities(newCities: List<CityRm>) {
myCities.clear()
myCities.addAll(newCities)
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): cityScPageViewHolder {
return cityScPageViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.item_cities, parent, false)
)
}
override fun onBindViewHolder(holder: cityScPageViewHolder, position: Int) {
holder.itemView.setOnClickListener {
SingletonCityID.cityID = myCities[position].cId
val action = citySelectionPageDirections.goToEventListPage()
Navigation.findNavController(it).navigate(action)
}
holder.bind(myCities[position])
}
override fun getItemCount(): Int {
Log.d("live data size",myCities.size.toString())
return myCities.size
}
class cityScPageViewHolder(view: View): RecyclerView.ViewHolder(view){
private val cityName = view.findViewById<TextView>(R.id.cityName)
fun bind(myCity: CityRm) {
cityName.text = myCity.name
}
}
}

编辑:当我使用LiveData<列表>如果我尝试使用MutableLiveData(对于CityRm、Dao和Repository(,也会得到相同的错误日志,而不是List

@fatihberatcan由于以下原因,它在第一次启动时为空。由于您正在从数据库中加载城市,所以在第一次启动时,它将不在那里。数据库中还没有城市。您调用city API,并将其存储在数据库中,但您不会因此得到任何事件。换句话说,您的片段/UI不知道城市列表现在在数据库中。您需要使用一些被动的方式,如David Kroukamp提到的Livedata,以便在数据更改时收到通知。

正如您所提到的,下次或下次启动应用程序时,城市列表现在就在数据库中,因此您可以在屏幕上看到它。

最新更新