Requisito previo:
Room es uno de los componentes de la arquitectura Jetpack en Android. Esto proporciona una capa abstracta sobre la base de datos SQLite para guardar y realizar operaciones en datos persistentes localmente. Google recomienda esto sobre la base de datos SQLite, aunque las API de SQLite son más poderosas, tienen un nivel bastante bajo, lo que requiere mucho tiempo y esfuerzo para usar. Pero Room hace que todo sea fácil y claro para crear una base de datos y realizar operaciones en ella. El patrón singleton es uno de los patrones de diseño más simples. A veces necesitamos tener solo una instancia de nuestra clase, por ejemplo, una sola conexión de base de datos compartida por varios objetos, ya que crear una conexión de base de datos separada para cada objeto puede ser costoso. De manera similar, puede haber un solo administrador de configuración o administrador de errores en una aplicación que maneje todos los problemas en lugar de crear varios administradores. En resumen, usamos el patrón Singleton cuando necesitamos instanciar una sola instancia de una clase. Definimos una clase de tal manera que solo se puede crear una instancia.
¿Dónde podemos usar el patrón Singleton en el desarrollo de Android?
Algunos de los ejemplos en los que podemos usar Singleton Pattern en Android son:
- Cuando usamos la base de datos Room, solo necesitamos una instancia de la clase Room Database en toda la aplicación. Tener la cantidad de instancias de una base de datos puede provocar pérdidas de memoria. Por lo tanto, usamos los patrones singleton en la base de datos.
- En la arquitectura MVVM , cuando creamos un repositorio, solo necesitamos una instancia, ya que nada cambia en la clase del repositorio durante la ejecución de la aplicación.
También hay otras situaciones en las que preferimos usar el patrón Singleton. En este artículo, nos centraremos en cómo usar el patrón Singleton en Android. Como tenemos la idea detrás del uso del patrón Singleton en la base de datos, ahora continuaremos con la implementación.
Implementación
Aquí, implementaremos la base de datos Room (asumiendo una base de datos para almacenar contactos) usando el patrón Singleton.
- Primero, definiremos la entidad de datos.
- Será una clase de datos, vamos a darle un nombre Contact.kt
Consulte el siguiente código como referencia.
Kotlin
import androidx.room.Entity import androidx.room.PrimaryKey @Entity(tableName = "contact") data class Contact( @PrimaryKey(autoGenerate = true) val id: Int, val name: String, val phoneNum: String )
(autoGenerate = true) se usa para incrementar automáticamente a id cada vez que se agregan nuevos datos.
- Entonces necesitamos crear Dao.
- Dao es una interfaz, por lo que no es necesario definir métodos dentro de ella. El espacio se ocupa de la implementación de estos métodos.
- Dao está acostumbrado a acceder al objeto de datos en la base de datos.
Consulte el siguiente código como referencia.
Kotlin
import androidx.lifecycle.LiveData import androidx.room.Dao import androidx.room.Insert import androidx.room.Query @Dao interface ContactDao { @Insert fun insert(contact: Contact) @Query("Select * From contact") fun getContact():List<Contact> }
- Ahora crearemos la clase de la base de datos, es el principal punto de acceso a los datos persistentes de la aplicación.
- Es una clase abstracta, hereda RoomDatabase. Aquí implementamos el patrón singleton.
Consulte el siguiente código como referencia.
Kotlin
import android.content.Context import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase @Database(entities = [Contact::class], version = 1) abstract class ContactDatabase : RoomDatabase() { abstract fun contactDao(): ContactDao companion object { private var INSTANCE: ContactDatabase? = null fun getDatabase(context: Context): ContactDatabase { if (INSTANCE == null) { synchronized(this) { INSTANCE = Room.databaseBuilder(context,ContactDatabase::class.java, "contact_database") .build() } } return INSTANCE!! } } }
- Hemos usado un objeto complementario para acceder directamente al método getDatabase( ) al crear una instancia de la clase de base de datos.
- Hemos utilizado un bloque sincronizado para evitar múltiples llamadas a la vez desde diferentes subprocesos.
Por lo tanto, este objeto complementario es común siempre que desee utilizar el patrón Singleton en la base de datos Room.
Publicación traducida automáticamente
Artículo escrito por ayushpandey3july y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA