Preferencias DataStore en Android

Preference Data Store se utiliza para almacenar datos de forma permanente en Android. Anteriormente teníamos Preferencias compartidas para lo mismo, pero dado que está en desuso, ahora estamos usando Data Store. A continuación se muestra un video de muestra para tener una idea de lo que vamos a hacer en este artículo. Tenga en cuenta que vamos a implementar este proyecto utilizando el lenguaje Kotlin .

Implementación paso a paso

Paso 1: Crear un nuevo proyecto

Para crear un nuevo proyecto en Android Studio, consulte Cómo crear/iniciar un nuevo proyecto en Android Studio . Tenga en cuenta que seleccione Kotlin como lenguaje de programación

Paso 2: agregue la dependencia dentro de build.gradle (aplicación)

Agregue la dependencia Data Store , Lifecycle y Coroutines dentro de build.gradle (aplicación) y haga clic en el botón sincronizar ahora .

   // Preferencias Almacén de datos

   implementación «androidx.datastore:datastore-preferences:1.0.0-alpha01»

   // componentes del ciclo de vida

   implementación “androidx.lifecycle:lifecycle-livedata-ktx:2.2.0”

   implementación «androidx.lifecycle:lifecycle-extensions:2.2.0»

   implementación «androidx.lifecycle:lifecycle-common-java8:2.2.0»

   implementación «androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0»

   // Componentes de rutinas de Kotlin

   implementación “org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.10”

   api «org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1»

   api «org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1»

Paso 3: trabajar con el archivo activity_main.xml

Vaya al archivo activity_main.xml y consulte el siguiente código. A continuación se muestra el código para el archivo activity_main.xml . Esto es para el diseño básico utilizado en la aplicación.

XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    tools:context=".MainActivity">
  
    <EditText
        android:id="@+id/et_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:layout_marginTop="20dp"
        android:ems="10"
        android:hint="Name" />
  
    <EditText
        android:id="@+id/et_age"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:ems="10"
        android:hint="Age"
        android:inputType="number" />
  
    <Button
        android:id="@+id/btn_save"
        android:layout_width="150dp"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:background="#FF7043"
        android:padding="10dp"
        android:text="Save user"
        android:textColor="@android:color/white" />
  
    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:text="Name"
        android:textColor="@android:color/black"
        android:textSize="20sp" />
  
    <TextView
        android:id="@+id/tv_age"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:text="Age"
        android:textColor="@android:color/black"
        android:textSize="20sp" />
  
</LinearLayout>

Paso 4: trabajar con la clase UserManager.kt

Cree una nueva clase de kotlin y asígnele el nombre UserManager , esta clase contiene el código para guardar y recuperar datos del almacén de datos de preferencia. Se agregan comentarios dentro del código para comprender el código con más detalle.

Kotlin

import android.content.Context
import androidx.datastore.preferences.createDataStore
import androidx.datastore.preferences.edit
import androidx.datastore.preferences.preferencesKey
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
  
class UserManager(context: Context) {
  
    // Create the dataStore and give it a name same as shared preferences
    private val dataStore = context.createDataStore(name = "user_prefs")
  
    // Create some keys we will use them to store and retrieve the data
    companion object {
        val USER_AGE_KEY = preferencesKey<Int>("USER_AGE")
        val USER_NAME_KEY = preferencesKey<String>("USER_NAME")
    }
  
    // Store user data
    // refer to the data store and using edit 
    // we can store values using the keys
    suspend fun storeUser(age: Int, name: String) {
        dataStore.edit {
            it[USER_AGE_KEY] = age
            it[USER_NAME_KEY] = name
  
            // here it refers to the preferences we are editing
  
        }
    }
  
    // Create an age flow to retrieve age from the preferences
    // flow comes from the kotlin coroutine
    val userAgeFlow: Flow<Int> = dataStore.data.map {
        it[USER_AGE_KEY] ?: 0
    }
  
    // Create a name flow to retrieve name from the preferences
    val userNameFlow: Flow<String> = dataStore.data.map {
        it[USER_NAME_KEY] ?: ""
    }
}

Paso 5: trabajar con el archivo MainActivity.kt

Vaya al archivo MainActivity.kt y consulte el siguiente código. A continuación se muestra el código del archivo MainActivity.kt . Se agregan comentarios dentro del código para comprender el código con más detalle.

Kotlin

import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.asLiveData
import androidx.lifecycle.observe
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
  
class MainActivity : AppCompatActivity() {
  
    lateinit var etName: EditText
    lateinit var etAge: EditText
    lateinit var tvName: TextView
    lateinit var tvAge: TextView
    lateinit var saveButton: Button
  
    lateinit var userManager: UserManager
    var age = 0
    var name = ""
  
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
  
        etName = findViewById(R.id.et_name)
        etAge = findViewById(R.id.et_age)
        tvName = findViewById(R.id.tv_name)
        tvAge = findViewById(R.id.tv_age)
        saveButton = findViewById(R.id.btn_save)
  
        // Get reference to our userManager class
        userManager = UserManager(this)
  
        // this function saves the data to
        // preference data store on click of
        // save Button
        buttonSave()
  
        // this function retrieves the saved data
        // as soon as they are stored and even
        // after app is closed and started again
        observeData()
    }
  
    private fun buttonSave() {
        // Gets the user input and saves it
        saveButton.setOnClickListener {
            name = etName.text.toString()
            age = etAge.text.toString().toInt()
  
            // Stores the values
            // Since the storeUser function of UserManager
            // class is a suspend function
            // So this has to be done in a coroutine scope
            GlobalScope.launch {
                userManager.storeUser(age, name)
            }
        }
    }
  
    private fun observeData() {
        // Updates age
        // every time user age changes it will be observed by userAgeFlow
        // here it refers to the value returned from the userAgeFlow function 
        // of UserManager class
        this.userManager.userAgeFlow.asLiveData().observe(this) {
            age = it
            tvAge.text = it.toString()
        }
  
        // Updates name
        // every time user name changes it will be observed by userNameFlow
        // here it refers to the value returned from the usernameFlow function 
        // of UserManager class
        userManager.userNameFlow.asLiveData().observe(this) {
            name = it
            tvName.text = it.toString()
        }
    }
}

Producción:

Repositorio de Github aquí .

Publicación traducida automáticamente

Artículo escrito por introidx y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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