StateFlow, который получает данные из базы данных Room Dao, внедренные в модель представления, не обновляется после dao.Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 StateFlow, который получает данные из базы данных Room Dao, внедренные в модель представления, не обновляется после dao.

Сообщение Anonymous »

В моем проекте Android Jetpack Compose с базой данных Room ViewModel представляет собой Dao с внедрением рукоятки и имеет свойство типа StateFlow, значение которого является результатом вызова dao.getAll(). Я попытался предварительно заполнить объект моей базы данных, используя функцию ViewModel, которая вызывает dao.insertAll() и вызывает эту функцию из макета создания. Функция dao.insertAll() успешно возвращает список идентификаторов объектов, но соответствующее свойство ViewModel типа StateFlow не обновляется.
Моя ViewModel (частично)

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

@HiltViewModel
class CalendarViewModel @Inject constructor(private val scheduleDao : ScheduleDao) : ViewModel() {
val schedule : StateFlow = scheduleDao.getAll().stateIn(
scope = viewModelScope,
started = SharingStarted.Lazily,
initialValue = emptyList()
)
private fun getScheduleEntities() : List {
val scheduleEntities = mutableListOf()
try {
val startDate = LocalDate(2000, 1, 1)
val endDate = java.time.LocalDate.now().toKotlinLocalDate()
val startTime = java.time.LocalTime.of(9, 0, 0)
val endTime = java.time.LocalTime.of(18, 0, 0)
val timeList = generateSequence(startTime) { it.plusMinutes(30) }.takeWhile { it  item.format(timeFormat) }
}
@TypeConverter
fun stringToListLocalTime(value : String?) : List? {
return value?.split(',')?.map { item ->  LocalTime.parse(item.trim(), timeFormat) }
}
}
Дао:

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

@Dao
interface ScheduleDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertOne(vararg scheduleEntity : ScheduleEntity)

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertAll(scheduleEntities : List): List

@Delete
suspend fun delete(scheduleEntity : ScheduleEntity)

@Query("SELECT * FROM ScheduleEntity")
fun getAll() : Flow
}
База данных комнат и модуль Hilt

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

@Database(entities = [ScheduleEntity::class], version = 1, exportSchema = false)
@TypeConverters(Converters::class)
abstract class CalendarDatabase : RoomDatabase() {
abstract fun scheduleDao() : ScheduleDao
companion object {
var INSTANCE : CalendarDatabase? = null
fun getDatabase(context: Context) : CalendarDatabase {
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(context.applicationContext, CalendarDatabase::class.java, "tasks")
.enableMultiInstanceInvalidation()
.build()
INSTANCE = instance
return instance
}
}
}
}

@Module
@InstallIn(SingletonComponent::class)
object TasksModule {
@Provides
@Singleton
fun provideApplicationScope(): CoroutineScope {
return CoroutineScope(SupervisorJob() + Dispatchers.IO)
}
@Provides
@Singleton
fun provideDatabase(
@ApplicationContext context: Context) : CalendarDatabase = CalendarDatabase.getDatabase(context)
@Provides
@Singleton
fun provideScheduleDao(calendarDatabase : CalendarDatabase) : ScheduleDao = calendarDatabase.scheduleDao()
}
Мой макет компоновки (частично)

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

@Composable
fun MainLayout(modifier: Modifier? = null, viewModel : CalendarViewModel = hiltViewModel()) {
val schedule by viewModel.schedule.collectAsStateWithLifecycle()
viewModel.fillScheduleEntities()
}
Я также пробовал использовать RefreshTrigger:

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

private val refreshTrigger = MutableSharedFlow(replay = 1).apply { tryEmit(Unit) }
val schedule : StateFlow = refreshTrigger.flatMapLatest { scheduleDao.getAll() }.stateIn(
scope = viewModelScope,
started = SharingStarted.Lazily,
initialValue = emptyList()
)
...
scheduleEntities = getScheduleEntities()
val scheduleIds = scheduleDao.insertAll(scheduleEntities)
refreshTrigger.emit(Unit)
Но это не помогло. Как я могу решить эту проблему?


Подробнее здесь: https://stackoverflow.com/questions/798 ... del-is-not
Ответить

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

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

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

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

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