¿Cómo crearías una base de datos?
sobes.tech AI
Respuesta de la IA
Estoy usando la Biblioteca de Persistencia Room.
-
Agregar dependencias:
// build.gradle (nivel de la app) dependencies { def room_version = "2.5.2" // o la versión actual implementation("androidx.room:room-runtime:$room_version") annotationProcessor("androidx.room:room-compiler:$room_version") // Para Kotlin usa kapt("...") // Opcional: soporte para extensiones Kotlin y corutinas en Room implementation("androidx.room:room-ktx:$room_version") } -
Definición de Entidades (tablas):
Creo una clase anotada como
@Entity. Cada campo será una columna, y@PrimaryKeyserá la clave primaria.// User.java import androidx.room.Entity; import androidx.room.PrimaryKey; @Entity(tableName = "users") public class User { @PrimaryKey(autoGenerate = true) public int id; public String firstName; public String lastName; } -
Definición de DAO (Objeto de Acceso a Datos):
Creo una interfaz anotada como
@Dao, con métodos para acceder a los datos (insertar, actualizar, eliminar, consultar).// UserDao.java import androidx.room.Dao; import androidx.room.Delete; import androidx.room.Insert; import androidx.room.OnConflictStrategy; import androidx.room.Query; import androidx.room.Update; import java.util.List; @Dao public interface UserDao { @Query("SELECT * FROM users") List<User> getAll(); @Query("SELECT * FROM users WHERE id IN (:userIds)") List<User> loadAllByIds(int[] userIds); @Query("SELECT * FROM users WHERE first_name LIKE :first AND " + "last_name LIKE :last LIMIT 1") User findByName(String first, String last); @Insert(onConflict = OnConflictStrategy.IGNORE) void insertAll(User... users); @Delete void delete(User user); @Update void updateUsers(User... users); } -
Definición de la base de datos:
Creo una clase abstracta que extiende
RoomDatabase, anotada con@Database. Incluyo la lista de entidades y DAO.// AppDatabase.java import androidx.room.Database; import androidx.room.RoomDatabase; @Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); } -
Inicialización de la base de datos:
Obtengo una instancia de la base de datos, generalmente en la clase Application o en una Activity (aunque preferiblemente en Application para un singleton).
// En la clase Activity o Application import android.content.Context; import androidx.room.Room; public class DatabaseInitializer { private static AppDatabase db; public static synchronized AppDatabase getDatabase(Context context) { if (db == null) { db = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, "database-name") // .allowMainThreadQueries() // No recomendado para producción // .fallbackToDestructiveMigration() // Ten cuidado con las migraciones .build(); } return db; } } -
Ejecutar operaciones con los datos:
Con la instancia de DAO, ejecuto operaciones en la base de datos, preferiblemente en un hilo de fondo (por ejemplo, usando
AsyncTask,Executors, Coroutines, RxJava).// En la Activity o en otro lugar new Thread(() -> { AppDatabase db = DatabaseInitializer.getDatabase(getApplicationContext()); UserDao userDao = db.userDao(); // Insertar User user1 = new User(); user1.firstName = "John"; user1.lastName = "Doe"; userDao.insertAll(user1); // Leer List<User> allUsers = userDao.getAll(); // ... procesamiento de datos }).start();
Este enfoque proporciona una abstracción sobre SQLite, simplifica la gestión de la base de datos y ofrece verificación de consultas en tiempo de compilación.