Не уверен, как преобразовать курсор в возвращаемый тип этого метода с помощью DAO

#android

#Android

Вопрос:

У меня проблема с типом возврата в интерфейсе DAO. Я провел исследование и попытался сделать это без/с приостановкой и все равно то же самое.

 Error: Not sure how to convert a Cursor to this method's return type ...   

Дао

 @Query("SELECT * FROM notification_list ORDER BY id ASC")  abstract fun readAllDataState(): DataStatelt;Listlt;NotificationItemsResponse.NotificationItemDatagt;gt;  

Мое использование:

 class GetNotificationListItemDetailsUseCase @Inject constructor(private val notificationDao: NotificationDao): BaseFlowUseCaselt;Unit, DataStatelt;Listlt;NotificationItemsResponse.NotificationItemDatagt;gt;gt;() {  override fun create(params: Unit): Flowlt;DataStatelt;Listlt;NotificationItemsResponse.NotificationItemDatagt;gt;gt; {  return flow{  emit(DataState.Loading)   try {  emit(DataState.Success(notificationDao.readAllDataState()))  } catch(e: Exception) {  emit(DataState.Error(e)) // error, and send the exception  }  

Модель представления

 val notificationData = MutableStateFlowlt;Listlt;NotificationItemsResponse.NotificationItemDatagt;gt;(emptyList())  [..]  fun getActualState() {  viewModelScope.launch {  getNotificationListItemDetailsUseCase.build(Unit).collect {  notificationData.value = it  Log.d("test2", "${notificationData.value}")   }  }  }   

Фрагмент

 GlobalScope.launch { collectNotificationItems() }  [..]   private suspend fun collectNotificationItems() {  vm.notificationData.collectLatest { dataState -gt;  when(dataState) {  is DataState.Error -gt; {  collectErrorState()  Log.d("collectNotificationItems", "Collect ErrorState")  }  DataState.Loading -gt; {  Log.d("collectNotificationItems", "Collect Loading")  }  is DataState.Successlt;*gt; -gt; {  vm.notificationData.collectWith(viewLifecycleOwner) {  notificationAdapter.items = it  notificationAdapter.notifyDataSetChanged()  Log.d("collectNotificationItems", "Collect Sucess")  }  }  }  }  

Есть все детали выше, я надеюсь, что этого достаточно, чтобы решить эту проблему.

Ответ №1:

Комната не знает, как вернуть тип состояния данных. Измените readAllDataState() тип возвращаемого значения на Listlt;NotificationItemsResponse.NotificationItemDatagt; и сделайте функцию suspend , таким образом, вы получите только одно значение для каждого вызова. Затем просто оберните возвращенное значение emit(DataState.Success(returnedValue)) . Подобный этому:

 @Query("SELECT * FROM notification_list ORDER BY id ASC") abstract suspend fun readAllDataState(): Listlt;NotificationItemsResponse.NotificationItemDatagt;  
 class GetNotificationListItemDetailsUseCase @Inject constructor(private val notificationDao: NotificationDao): BaseFlowUseCaselt;Unit, DataStatelt;Listlt;NotificationItemsResponse.NotificationItemDatagt;gt;gt;() {   override fun create(params: Unit): Flowlt;DataStatelt;Listlt;NotificationItemsResponse.NotificationItemDatagt;gt;gt; =   flow {  emit(DataState.Loading)  try {  emit(DataState.Success(notificationDao.readAllDataState()))  } catch(e: Exception) {  emit(DataState.Error(e)) // error, and send the exception  }  }  

Комментарии:

1. Хорошо, спасибо. так много