Как выполнить миграцию из прототипа DataStore в прототип DataStore с помощью Dagger HiltAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как выполнить миграцию из прототипа DataStore в прототип DataStore с помощью Dagger Hilt

Сообщение Anonymous »

Я видел этот блог https://medium.com/androiddevelopers/da ... ca806eb1aa, но там не совсем подробно. В нем не показано, как выполнить миграцию данных из протохранилища данных, а также как это сделать с помощью Dagger Hilt.
Это то, что я делал до сих пор.
У меня есть AppSettings ( например AppPreferences)

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

@Serializable
data class AppSettings(
val prepareSeconds: Long = 10L,
val workSeconds: Long = 90L,
val restSeconds: Long = 30L,
val totalSets: Int = 3
) {
companion object {
fun getDefaultInstance() = AppSettings()
}
}
Сериализатор (я не использую файл .proto, у меня есть класс данных предпочтений, который я десериализую и сериализую)

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

object AppSettingsSerializer : Serializer {

override val defaultValue: AppSettings
get() = AppSettings()

override suspend fun readFrom(input: InputStream): AppSettings {
return try {
Json.decodeFromString(
deserializer = AppSettings.serializer(),
string = input.readBytes().decodeToString()
)
} catch (e: SerializationException) {
throw CorruptionException("Unable to read AppSettingsPrefs", e)
}
}

@Suppress("BlockingMethodInNonBlockingContext")
override suspend fun writeTo(t: AppSettings, output: OutputStream) {
output.write(
Json.encodeToString(
serializer = AppSettings.serializer(),
value = t
).encodeToByteArray()
)
}
}
Наконец-то модуль рукояти кинжала

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

@Module
@InstallIn(SingletonComponent::class)
object AppModule {

@Singleton
@Provides
fun provideAppSettingsDataStore(
@ApplicationContext appContext: Context,
coroutineScope: CoroutineScope,
): DataStore {
return DataStoreFactory.create(
serializer = AppSettingsSerializer,
corruptionHandler = ReplaceFileCorruptionHandler {
AppSettings.getDefaultInstance()
},
scope = coroutineScope,
produceFile = {
appContext.dataStoreFile(DATA_STORE_FILE_NAME)
},
migrations = listOf(object : DataMigration {

// Specify your condition for whether the migration should happen
override suspend fun shouldMigrate(currentData: AppSettings) = true

// Instruction on how exactly the old data is transformed into new data
// I DO NOT THINK THIS IS RIGHT WAY TO DO IT, HOW SHOULD IT BE DONE??
override suspend fun migrate(currentData: AppSettings): AppSettings =
AppSettings(
prepareSeconds = currentData.prepareSeconds,
workSeconds = currentData.workSeconds,
restSeconds = currentData.restSeconds,
totalSets = currentData.totalSets,
)

// Once the migration is over, clean up the old storage
override suspend fun cleanUp() = Unit
})
)
}
Когда я обновляю настройки приложения (Настройки) с помощью нового поля/обновляю имя существующего поля/удаляю какое-либо поле. Тогда DataStore не выполняет миграцию, а повторно инициализируется со значением по умолчанию.
Что я делаю неправильно. Может ли кто-нибудь дать мне какие-либо ресурсы/блог или код о том, как выполнить миграцию данных прототипа хранилища данных с помощью Dagger Hilt.

Подробнее здесь: https://stackoverflow.com/questions/785 ... agger-hilt
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

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

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