Это то, что я делал до сих пор.
У меня есть 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()
}
}
Код: Выделить всё
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
})
)
}
Что я делаю неправильно. Может ли кто-нибудь дать мне какие-либо ресурсы/блог или код о том, как выполнить миграцию данных прототипа хранилища данных с помощью Dagger Hilt.
Подробнее здесь: https://stackoverflow.com/questions/785 ... agger-hilt