Realm parte 1

Standard

Antes que nada les mando un saludo y me presento: Mi nombre es César Abel Otero Robles A.K.A “el mano” ;), tengo 29 años cumplidos, soy de Los Mochis y vivo en Culiacán desde hace 6 años. Soy desarrollador, con un tanto más de enfoque al backend y bases de datos.

En esta ocasión les vengo manejando Realm. ¿Que es Realm? se estarán preguntando. Pues Realm es un motor de persistencia para dispositivos móviles, es multiplataforma (iOS, OS X y Android), mucho mas rápido que cualquier ORM actual y también es frecuentemente mas rápido que una consulta pura de SQLite

En Hunabsys nos topamos con Realm buscando alternativas para un proyecto que estamos realizando, al final decidimos realizar un pequeño benchmarking entre SQLite y Realm. De estas pruebas se desprendieron estos tiempos:

Tiempos SQLite
Carga de datos desde archivo CSV Inserción de registros Inserción de registros promedio Selección de registros Eliminación de registros
1K 7.70 22,225.00 21.70 26.70 36.30
10K 63.50 354,816.50 35.00 246.30 254.30
Tiempos Realm
Carga de datos desde archivo JSON Inserción de registros por batch Inserción de registros promedio Eliminación de registros Selección de registros Carga de archivo Realm
1K 574.9 458 10.40 14.9 2.4 41
10K 5,964.1 5,944.6 115.53 55 5.9 81

*Los tiempos son en milisegundos.

Y estas son algunas de las características que definimos en la evaluación de estas alternativas:

Características Evaluadas
Características Herramientas
SQLite Realm Key-Value Archivos
Herramienta para análisis NO NO NO NO
Herramienta para acceso a discos SI SI SI NO
Capacidad de definir referencias SI SI NO NO
Capacidad para manipular datos BLOBs SI NO NO SI
Capacidad para definir indices SI SI NO NO

En base a las pruebas decidimos usar Realm para nuestra aplicación. Cuenta con una creciente base de usuarios y con un soporte bastante amplio, es sencillo de implementar en los proyectos y a su vez esta demostrando ser muy flexible y con resultados prometedores.

Algunas de las características que Realm nos ofrece son las siguientes:

  • Annotations: al crear un modelo en realm, podemos usar annotations tales como.
    • PrimaryKey: Nos permite identificar una propiedad del modelo como nuestra llave primaria. La propiedad tiene que ser del tipo string o entero.
    • Index: Nos permite especificar un campo como indexado, esto nos permitirá realizar consultas más rápidas, pero nuestras inserciones a la base de datos más lentas por la regeneración de los índices.
    • Ignore: Podemos especificar propiedades que no queramos persistir en nuestro archivo realm con este annotation. Propiedades que aunque se necesiten en nuestro modelo, no es necesario persistirlas en nuestra base de datos.
  • Hasta el momento los siguientes tipos de datos son los únicos soportados.
    • boolean
    • short
    • int
    • long
    • float
    • double
    • String
    • Date
    • byte[]
    • RealmObject y RealmList<? extends RealmObject> son soportados dentro de nuestros modelos para el manejo de relaciones.
  • Relaciones: Aunque será revisado con detalle más adelante, podemos manejar relaciones entre nuestros modelos, con solo agregar como propiedad otro modelo que extienda de RealmObject o con listas del tipo RealmList.
  • Transacciones: Con Realm cada vez que queremos hacer inserciones, actualizaciones o eliminar información de nuestra base de datos lo hacemos por medio de transacciones, esto nos asegura que si hay algún problema con la información o con nuestro archivo, esta no se ejecutará ni afectará la integridad de nuestra base de datos.
  • Múltiples Realms: Es posible manejar múltiples Realms dentro de la misma aplicación, dividirla por módulos y manejar los Realms por separado, aunque pertenezcan a la misma aplicación.
  • Encriptado: Es posible encriptar nuestro Realm para que solo podamos leerlo y accederlo con las llaves generadas o proveídas por nosotros.

Actualmente tiene ciertas limitaciones que están expuestas en su pagina para que consideres la decision de usarlo o no:

  • Nombres de clases no mayores a 57 caracteres
  • Nombres de campos no mayores a 63 caracteres
  • No soporta transacciones anidadas
  • No soporta datos nulos
  • No se pueden compartir Realms a traves de hilos, aun así, es posible que multiples hilos accedan al mismo Realm.
  • Si ocupas valores autoincrementales, tienen que ser manejados por el software, Realm no cuenta con esa capacidad, al menos aun.

Por el momento lo dejaremos hasta aquí, en la próxima entrega haremos una app de prueba en Android donde explicaremos todo lo referente a la implementación.

Pasen un muy buen fin de semana, hasta la próxima.

Referencias:

https://realm.io/

Leave a Reply

Your email address will not be published. Required fields are marked *