Veremos cómo trabajar Realm con Android. Realm es una base de datos para aplicaciones móviles que es una excelente alternativa a SQLite. Veremos cómo instalar Realm en Android, y cómo configurar la base de datos.
Veamos cómo instalar Realm como un plugin de Gradle.
Ve al archivo build.gradle que está dentro de app -> src -> build.gradle
Abre el archivo y añade ésta línea:
apply plugin: ‘realm-android’
Ir al archivo build.gradle que está dentro de tu proyecto:
En la sección de dependencies añade ésta línea:
classpath “io.realm:realm-gradle-plugin:5.7.0″
Si tienes dudas o problemas puedes leer la documentación de Realm en https://realm.io/docs/java/latest
Actualiza las dependencias. Da clic en el enlace Sync Now.
Vamos a crear los siguientes paquetes:
Activities, App, Adapters y Models.
Da clic derecho sobre el equivalente a “com.example.gibgarcia.gibdata” en tu proyecto y elige New -> Package. A cada package dale el nombre ya indicado.
Mueve el MainActivity al paquete Activities (solo arrastra el archivo). Deberá verse todo así:
Vamos a crear dentro de models los archivos: Board y Note.
En el paquete models agrega una clase llamada Board y luego una clase llamada Note (Click derecho sobre models, luego en New -> Java Class. Indica el nombre de Board, y repite para Note). La estructura debería quedar de la siguiente manera:
La clase Board (tablero) nos permitirá crear notas (Note). Veamos el código de cada clase.
public class Note extends RealmObject { @PrimaryKey //import io.realm.annotations.PrimaryKey private int id; @Required private String description; @Required private Date createdAt; //imports java.util.Date public Note(String description){ this.id = MyApplication.NoteId.incrementAndGet(); this.description = description; this.createdAt = new Date(); } public int getId() { return id; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public Date getCreatedAt() { return createdAt; } }
Ésta clase hereda de RealmObject y define un modelo de datos para nuestra aplicación.
Observa que la clase (y el objeto de Base de Datos) Note contendrá un id, una descripción y la fecha en la que fue creada la nota.
Con anotaciones de Realm, le podemos indicar si es clave primaria o si el dato es requerido.
La clase Board es muy parecida, solo que se programará para que un Board tenga varios Notes.
public class Board extends RealmObject{ @PrimaryKey //import io.realm.annotations.PrimaryKey private int id; @Required private String title ; @Required private Date createdAt; //imports java.util.Date private RealmList<Note> notes; //Un tablero puede tener muchas notas. //Realm requiere este constructor vacío. public Board(){ } public Board(String title){ this.id = MyApplication.BoardId.incrementAndGet(); this.title = title; this.createdAt = new Date(); this.notes = new RealmList<Note>(); } public int getId() { return id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public Date getCreatedAt() { return createdAt; } public RealmList<Note> getNotes() { return notes; } }
Recuerda que puedes generar los setter y getter dado clic auxiliar y luego en generate. Nota que no estamos utilizando el setter de id ni el de createdAt.
Crea una nueva clase llamada MyApplication dentro del package app.
Código de la clase MyApplication
public class MyApplication extends Application { public static AtomicInteger BoardId = new AtomicInteger(); public static AtomicInteger NoteId = new AtomicInteger(); @Override public void onCreate() { //Esta clase será ejecutada antes de nuestro ManinActivity //Aqui leemos de la BD cuál es el máximo valor de ID que tenemos super.onCreate(); setUpRealConfig(); // Método para configurar la BD Realm realm = Realm.getDefaultInstance(); BoardId = getIdByTable(realm, Board.class); NoteId = getIdByTable(realm, Note.class); realm.close(); } private void setUpRealConfig(){ Realm.init(getApplicationContext()); RealmConfiguration config = new RealmConfiguration.Builder() .deleteRealmIfMigrationNeeded() .build(); Realm.setDefaultConfiguration(config); } private <T extends RealmObject> AtomicInteger getIdByTable (Realm realm , Class<T> anyClass){ RealmResults<T> results = realm.where(anyClass).findAll(); return (results.size()>0) ? new AtomicInteger(results.max("id").intValue()) : new AtomicInteger(); } }
Ésta clase se ejecutará antes de que se ejecute nuestro MainActivitiy (la primera interfaz de la aplicación), por lo que nos sirve para realizar la configuración por defecto de Realm, y para recuperar el último id de cada una de las tablas.
Para que la aplicación reconozca ésta clase, debemos incluirla en el archivo AndroidManifest.xml. Por ejemplo:
En el siguiente artículo continuaremos ésta aplicación.