Presentamos el DataStore. Nueva forma de almacenar datos en Android Douglas Fornaro | Medio

Una nueva forma de almacenar datos en Android.

  • Solución de almacenamiento nueva y mejorada para reemplazar SharedPreferences.
  • Rutinas de Kotlin y Flow.
  • Los datos se almacenan de forma asincrónica, coherente y transaccional.

Proporciona dos implementaciones diferentes:

  • Preferencias de DataStore: almacena pares de datos primitivos de clave-valor.
  • Proto DataStore: guarda los objetos especificados.

En ambas implementaciones, DataStore guarda las preferencias en un archivo y realiza todas las operaciones de datos. Dispatchers.IO a menos que se indique lo contrario.

  • Conocimiento de coroutinas y Kotlin Flow.

Gradle:

// Preferences DataStore 
implementation “androidx.datastore:datastore-preferences:1.0.0-alpha02”
// Proto DataStore
implementation “androidx.datastore:datastore-core:1.0.0-alpha02”

Pro Proto DataStore:

syntax = "proto3";  option java_package = "<your package name here>"; 
option java_multiple_files = true;
message Settings {
int my_counter = 1;
}

Preferencias de DataStore:

val dataStore: DataStore<Preferences> = 
context.createDataStore(name = "settings")

Proto DataStore:

object SettingsSerializer : Serializer<Settings> {
override fun readFrom(input: InputStream): Settings {
try {
return Settings.parseFrom(input)
} catch (exception: InvalidProtocolBufferException) {
throw CorruptionException("Cannot read proto.", exception)
}
}

override fun writeTo(
t: Settings,
output: OutputStream) = t.writeTo(output)
}

val settingsDataStore: DataStore<Settings> = context.createDataStore(
fileName = "settings.pb",
serializer = SettingsSerializer
)

Preferencias de DataStore:

val MY_COUNTER = preferencesKey<Int>("my_counter")
val myCounterFlow: Flow<Int> = dataStore.data
.map { currentPreferences ->
// Unlike Proto DataStore, there's no type safety here.
currentPreferences[MY_COUNTER] ?: 0
}

Proto DataStore:

val myCounterFlow: Flow<Int> = settingsDataStore.data
.map { settings ->
// The myCounter property is generated for you from your proto schema!
settings.myCounter
}

Preferencias de DataStore:

suspend fun incrementCounter() {
dataStore.edit { settings ->
// We can safely increment our counter without losing data due to races!
val currentCounterValue = settings[MY_COUNTER] ?: 0
settings[MY_COUNTER] = currentCounterValue + 1
}
}

Proto DataStore:

suspend fun incrementCounter() {
settingsDataStore.updateData { currentSettings ->
// We can safely increment our counter without losing data due to races!
currentSettings.toBuilder()
.setMyCounter(currentSettings.myCounter + 1)
.build()
}
}

Preferencias de DataStore:

val dataStore: DataStore<Preferences> = context.createDataStore(
name = "settings",
migrations = listOf(SharedPreferencesMigration(context, "settings_preferences"))
)

Proto DataStore:

val settingsDataStore: DataStore<Settings> = context.createDataStore(
produceFile = { File(context.filesDir, "settings.preferences_pb") },
serializer = SettingsSerializer,
migrations = listOf(
SharedPreferencesMigration(
context,
"settings_preferences"
) { sharedPrefs: SharedPreferencesView, currentData: Settings ->
// Map your sharedPrefs to your type here
}
)
)

Jetpack DataStore es un reemplazo de SharedPrmidiferencias que abordan algunos problemas, como una API síncrona que puede parecer segura para llamar en el hilo de la interfaz de usuario, ningún mecanismo para señalar errores, falta de transacciones y más DataStore es una API totalmente asincrónica que utiliza Kotlin Coroutines y Flow, es coherente y maneja la migración de datos y la corrupción de datos.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *