Scroll to top

Spanish (Español) translation by Andrea Jiménez (you can also view the original English article)

Introducción

Si has estado pendiente de las últimas tendencias en el desarrollo de Android, probablemente hayas oído hablar de Realm. Realm es una base de datos ligera que puede reemplazar las bibliotecas SQLite y ORM en tus proyectos de Android.

En comparación con SQLite, Realm es más rápida y tiene muchas características modernas, como soporte JSON, una API fluida, notificaciones de cambio de datos y soporte de cifrado, todo lo cual facilita la vida a los desarrolladores de Android.

En este consejo rápido, aprenderás los conceptos básicos de Realm para Android. En este tutorial, usaré Realm v0.84.1.

1. Agregar Realm a un proyecto

Para usar Realm en un proyecto de Android, debes agregarlo como una dependencia compile en el archivo build.gradle del módulo de aplicación.

1
compile 'io.realm:realm-android:0.84.1'

2. Crear un Realm

Un Realm es similar a una base de datos SQLite. Tiene un archivo asociado que, una vez creado, permanecerá en el sistema de archivos de Android.

Para crear un nuevo Realm, puedes llamar al método estático Realm.getInstance desde dentro de cualquier Activity.

1
Realm myRealm = Realm.getInstance(context);

Ten en cuenta que llamar al método Realm.getInstance, sin pasarle un RealmConfiguration, da como resultado la creación de un archivo Realm llamado default.realm.

Si quieres agregar otro Realm a tu aplicación, debes usar un objeto RealmConfiguration.Builder y asignarle un nombre único al archivo Realm.

1
Realm myOtherRealm =
2
        Realm.getInstance(
3
                new RealmConfiguration.Builder(context)
4
                        .name("myOtherRealm.realm")
5
                        .build()
6
);

3. Crear un RealmObject

Cualquier JavaBean se puede almacenar en un Realm una vez que extiende la clase RealmObject. Si te estás preguntando qué es javaBean, es simplemente una clase Java que es serializable, tiene un constructor predeterminado y tiene métodos getter/setter para sus variables miembro. Por ejemplo, las instancias de la siguiente clase se pueden almacenar fácilmente en un Realm:

1
public class Country extends RealmObject {
2
3
    private String name;
4
    private int population;
5
6
    public Country() { }
7
8
    public String getName() {
9
        return name;
10
    }
11
12
    public void setName(String name) {
13
        this.name = name;
14
    }
15
16
    public int getPopulation() {
17
        return population;
18
    }
19
20
    public void setPopulation(int population) {
21
        this.population = population;
22
    }
23
24
}

Si quieres utilizar una variable miembro de un RealmObject como clave principal, puedes utilizar la anotación @PrimaryKey. Por ejemplo, así es como agregarías una clave principal denominada código a la clase Country:

1
@PrimaryKey
2
private String code;
3
4
public String getCode() {
5
    return code;
6
}
7
8
public void setCode(String code) {
9
    this.code = code;
10
}

4. Crear las transacciones

Si bien leer datos de un Realm es muy simple, como verás en el siguiente paso, escribir datos en él es un poco más complejo. Realm es compatible con ACID y para garantizar la atomicidad y la coherencia, Realm te obliga a ejecutar todas las operaciones de escritura dentro de una transacción.

Para iniciar una nueva transacción, usa el método beginTransaction. De forma similar, para finalizar la transacción, usa el método commitTransaction.

A continuación te muestro cómo crear y guardar una instancia de la clase Country:

1
myRealm.beginTransaction();
2
3
	// Create an object
4
	Country country1 = myRealm.createObject(Country.class); 
5
6
	// Set its fields
7
	country1.setName("Norway");
8
	country1.setPopulation(5165800);
9
	country1.setCode("NO");
10
11
myRealm.commitTransaction();

Es posible que hayas notado que country1 no se creó con el constructor de la clase Country. Para que un Realm administre una instancia de un RealmObject, la instancia debe crearse mediante el método createObject.

Si debes usar el constructor, no olvides usar el método copyToRealm del objeto Realm correspondiente antes de confirmar la transacción. Este es un ejemplo:

1
// Create the object
2
Country country2 = new Country();
3
country2.setName("Russia");
4
country2.setPopulation(146430430);
5
country2.setCode("RU");
6
7
myRealm.beginTransaction();
8
	Country copyOfCountry2 = myRealm.copyToRealm(country2);
9
myRealm.commitTransaction();

5. Redacción de consultas

Realm ofrece una API muy intuitiva y fluida para crear consultas. Para crear una consulta, utiliza el método where del objeto Realm correspondiente y pasa la clase de los objetos que te interesen. Después de crear la consulta, puedes buscar todos los resultados mediante el método findAll, que devuelve un objeto RealmResults. En el siguiente ejemplo, buscamos e imprimimos todos los objetos de tipo Country:

1
RealmResults<Country> results1 =
2
        myRealm.where(Country.class).findAll();
3
4
for(Country c:results1) {
5
    Log.d("results1", c.getName());
6
}
7
8
// Prints Norway, Russia

Realm ofrece varios métodos con nombres adecuados, como beginsWith, endsWith, lesserThangreaterThan, que puedes utilizar para filtrar los resultados. El siguiente código te muestra cómo puedes usar el método greaterThan para obtener solo aquellos objetos (País) Country cuya (población) population sea mayor de 100 millones: 

1
RealmResults<Country> results2 =
2
        myRealm.where(Country.class)
3
                .greaterThan("population", 100000000)
4
                .findAll();
5
6
// Gets only Russia

Si quieres que se ordenen los resultados de la consulta, puedes utilizar el método findAllSorted. Como argumentos, se necesita un String que especifique el nombre del campo por el que se va a ordenar y un boolean que especifique el orden de la clasificación.

1
// Sort by name, in descending order
2
RealmResults<Country> results3 =
3
        myRealm.where(Country.class)
4
                .findAllSorted("name", false);
5
6
// Gets Russia, Norway

Conclusión

En este consejo rápido, aprendiste a usar Realm en un proyecto de Android. Viste lo fácil que es crear una base de datos de Realm, almacenar datos en ella y consultarla. Para obtener más información sobre Realm para Android, puedes consultar tu documentación de Java.