Как я могу проверить из USECASE, существует ли запись в базе данных и если она не существует, вставить его и вернуть объAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу проверить из USECASE, существует ли запись в базе данных и если она не существует, вставить его и вернуть объ

Сообщение Anonymous »

В моем приложении я хочу сделать следующее на начальном экране: < /p>

Когда откроется экран, возьмите текущую дату и проверьте, если В базе данных есть запись с этой датой. и вставьте запись в базу данных. < /p>
< /li>
Во всех случаях (1) или (2) вернуть запись из базы данных, которая соответствует дате . < /p>
< /li>
< /ol>
Я пытаюсь с этим использованием, но это не работает: < /p>

Код: Выделить всё

class GetHomeUseCase @Inject constructor(
private val universalisRepository: UniversalisRepository,
private val userDataRepository: UserDataRepository,
) {

operator fun invoke(
date: Int,
): Flow {
return combine(
userDataRepository.userData,
universalisRepository.countUniversalis(UniversalisResourceQuery(date)),
) { userData, count ->
if (count == 0) {
universalisRepository.insertFromRemote(UniversalisResourceQuery(date))
}
HomeResource(
date = date,
data = universalisRepository.getUniversalisByDate(UniversalisResourceQuery(date))
.first(),
dynamic = userData
)
}
}
}
< /code>
Это ViewModel: < /p>
@HiltViewModel
class HomeViewModel @Inject constructor(
private val savedStateHandle: SavedStateHandle,
val userDataRepository: UserDataRepository,
getHomeUseCase: GetHomeUseCase,
) : ViewModel() {

// Key used to save and retrieve the currently selected topic id from saved state.
private val selectedTopicIdKey = "selectedTopicIdKey"
private val route: UniversalisRoute = savedStateHandle.toRoute()

private val selectedTopicId = savedStateHandle.getStateFlow(
key = selectedTopicIdKey,
initialValue = route.initialTopicId.toString(),
)
private val selectedDate = savedStateHandle.getStateFlow(
key = "date",
initialValue = Utils.hoy.toInt(),
)

val uiState: StateFlow = combine(
selectedTopicId,
getHomeUseCase.invoke(
date = selectedDate.value,
),
HomeUiState::HomeData,
).stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5_000),
initialValue = HomeUiState.Loading,
)

fun onTopicClick(topicId: String?) {
savedStateHandle[selectedTopicIdKey] = topicId
}
}

sealed interface HomeUiState {
data object Loading : HomeUiState
data class HomeData(
val selectedTopicId: String?,
val topics: HomeResource,
) : HomeUiState
data object Empty : HomeUiState
}
Это методы в репозитории :

Код: Выделить всё

override fun countUniversalis(query: UniversalisResourceQuery): Flow {
return universalisDao.countUniversalis(query.filterDate)
}
< /code>
и: < /p>
override suspend fun insertFromRemote(query: UniversalisResourceQuery) {
val networkUniversalis = network.getUniversalis(listOf(query.filterDate))
universalisDao.upsertUniversalis(networkUniversalis.data)
}
И это методы в dao :

Код: Выделить всё

@Query(value = "SELECT COUNT(*) FROM universalis WHERE todayDate=:filterDate")
fun countUniversalis(filterDate: Int = 0): Flow
< /code>
и: < /p>
@Upsert(entity = UniversalisEntity::class)
suspend fun upsertUniversalis(entities: List)
Я помещаю точку останова в этой строке gethomeusecase , и она на этом не останавливается.

Код: Выделить всё

{ userData, count ->
Что не так с моим подходом?

Подробнее здесь: https://stackoverflow.com/questions/794 ... d-if-it-do
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»