#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. Хорошо, спасибо. так много