Realm Mobile Database para iOS

Lo que vas a crear

Introducción

En este tutorial, le mostraré cómo utilizar una solución de base de datos en el dispositivo potente y elegante para sus aplicaciones de iOS: Realm Mobile Database. Una alternativa a Apple Core Data o SQLite con mapeo objeto-relacional (ORM), Realm Mobile Database ofrece a los desarrolladores una forma más fácil y natural de almacenar y consultar datos..

¿Qué es Realm Mobile Database??

Establecido como una verdadera base de datos de objetos, Realm se diferencia de otras bibliotecas similares al tratar los objetos de datos como objetos vivos-lo que significa que los objetos se actualizan automáticamente. Reaccionan en respuesta a los cambios y son fáciles de persistir. Aún mejor, no tiene la curva de aprendizaje empinada que tendría con Core Data o SQLite scripting. En su lugar, puede trabajar de una manera verdaderamente orientada a objetos. Realm Mobile Database también ha sido de código abierto a partir de 2016, y está disponible de forma gratuita para los desarrolladores..

Además de Realm Mobile Database, la compañía también ofrece Realm Mobile Platform, su PAAS insignia para complementar Realm Mobile Database con una solución del lado del servidor..

Realm Mobile Platform, amplía ese núcleo con sincronización de datos en tiempo real y manejo de eventos en el lado del servidor, todo conectado perfectamente a las aplicaciones. Los desarrolladores utilizan la plataforma para crear aplicaciones con una potente funcionalidad como mensajería, colaboración y capacidades sin conexión. La plataforma también es ideal para movilizar las API existentes, lo que facilita la creación de aplicaciones altamente receptivas y atractivas conectadas a sistemas y servicios heredados.. (realm.io)

Por lo tanto, Realm Mobile Platform funciona en el lado del servidor de la misma manera que Realm Mobile Database, proporcionando sincronización automática de datos y manejo de eventos entre el cliente y el servidor, y en el proceso de abstraer las complejidades que surgen cuando se trata de la sincronización de datos. Realm Mobile Platform está fuera del alcance de este tutorial, pero volveré a utilizarlo en una publicación futura..

Por qué Realm Mobile Database?

Más allá de salvar a los desarrolladores el dolor de cabeza y la pronunciada curva de aprendizaje de Core Data, Realm Mobile Database proporciona ventajas distintivas desde el primer momento..

Rendimiento y seguridad de subprocesos

En cuanto al rendimiento, se ha comprobado que Realm Mobile Database ejecuta consultas y sincroniza objetos significativamente más rápido que Core Data, y acceder a los datos simultáneamente no es un problema. Es decir, múltiples fuentes pueden acceder al mismo objeto sin la necesidad de administrar bloqueos o preocuparse por inconsistencias de datos.

Cifrado

Realm Mobile Database proporciona sus propios servicios de encriptación para proteger las bases de datos en el disco usando AES-256 + SHA2 mediante cifrado de 64 bytes.

Esto hace que todos los datos almacenados en el disco se cifren y descifren de forma transparente con AES-256 según sea necesario, y se verifiquen con un HMAC SHA-2. Se debe proporcionar la misma clave de cifrado cada vez que obtenga una instancia de Realm.

Multiplataforma

A diferencia de Core Data, Realm Mobile Database es verdaderamente multiplataforma, compatible con aplicaciones web iOS, Android, JavaScript y Xamarin.

Naturaleza reactiva

¡Debido a la forma en que funcionan los objetos vivos, puede conectar sus elementos de la interfaz de usuario a los modelos de datos y su interfaz de usuario se actualizará de manera reactiva a medida que cambien los datos! No se necesita un código de sincronización complicado o lógica de cableado, como lo haría con Core Data.

Cuando se combina con Realm Mobile Platform y Realm Object Server, los desarrolladores obtendrán el beneficio adicional de sincronizar sus datos con la nube simplemente configurando la URL del objeto Realm.

Incluso con Realm Mobile Platform, no tiene que preocuparse por las conexiones interrumpidas, ya que Realm tiene capacidades sin conexión integradas y pondrá en cola los cambios de datos que se enviarán al servidor..

Clientela

Realm tiene numerosos clientes distinguidos que han adoptado abiertamente Realm Mobile Database, incluyendo Netflix y Starbucks.

Alternativas a Realm Mobile Database

Por supuesto, Realm Mobile Database no es la única solución de almacenamiento de aplicaciones. Ya mencioné los datos básicos de Apple, y aunque es inherentemente más complicado de aprender, el hecho de que pertenezca a Apple significa que será el de facto solución de base de datos para muchos desarrolladores de iOS, y continuará teniendo una gran comunidad de desarrolladores y material de soporte.

Una solución que es algo similar a Realm Mobile Database es Firebase de Google, aunque se trata de una solución combinada del lado del cliente y del servidor. Firebase es igualmente fácil de usar y es gratuito para comenzar, pero los costos aumentarán a medida que lo haga su uso. Un inconveniente de Firebase es que usted está estrechamente vinculado a su plataforma, mientras que con Realm tiene la libertad de usar su propio back-end, o ningún back-end.!

Tu primera aplicación de reino

Conocimiento asumido

Este tutorial asume que usted tiene un conocimiento práctico de Swift, pero no se necesitan datos básicos ni conocimientos previos de bases de datos. 

Además de Realm, usaremos las siguientes partes de iOS:

  • UIKit: para demostrar nuestros datos visualmente.
  • CocoaPods: una biblioteca de dependencias de terceros que se utilizará para instalar Realm Mobile Database

Objetivos de este tutorial

Al final de este tutorial, habrá desarrollado una aplicación de tareas simple escrita en Swift y haciendo uso de Realm Mobile Database para conservar los datos localmente. Podrás crear una aplicación de tareas de Realm con todas las funciones que funcione, y en el camino aprenderás los siguientes conceptos:

  1. configurar la biblioteca Realm en un nuevo proyecto, a través de CocoaPods
  2. configurar el delegado de la aplicación para importar la biblioteca Realm
  3. creando los objetos modelo 'objeto vivo'
  4. crear los controladores de vista y el guión gráfico en la aplicación de la interfaz de usuario
  5. Conectando el modelo de datos a la vista controladores y vistas

Puede descargar el código fuente completo del tutorial GitHub repo.

Configurar el proyecto

Bien, comencemos a crear nuestra aplicación Realm: RealmDo. Vamos a crear un nuevo proyecto Xcode, así que adelante, crea una aplicación Master-Detail..

A continuación, si no ha instalado CocoaPods en su máquina, deberá hacerlo ahora. Así que salta a la terminal y escribe lo siguiente:

$ sudo gema instalar cocoapods

A continuación, debería obtener una confirmación de que Cocapodos está instalado. Mientras aún se encuentra en el terminal, navegue hasta el proyecto Xcode que acaba de crear y escriba lo siguiente para inicializar un nuevo Podfile:

$ pod init

Deberías ver un nuevo archivo llamado Podfile Ubicado en el directorio raíz de su proyecto. Básicamente, este archivo establece las bibliotecas que queremos utilizar en nuestro proyecto. Puede consultar la documentación oficial de CocoaPods para obtener más información sobre cómo funcionan los Podfiles..

A continuación, debemos agregar la biblioteca de cocoapod para Realm, así que abra el archivo Pod en un editor de texto y agregue lo siguiente debajo # Pods para RealmDo:

… Usa marcos dinámicos use_frameworks! # Pods para RealmDo pod 'RealmSwift' target 'RealmDoTests' do ... 

Guarde el archivo, salga y escriba:
instalación de la vaina

Una vez que CocoaPods termine de instalar la biblioteca, nos pedirá que cerremos nuestro proyecto Xcode y que abramos el espacio de trabajo. Haga eso, y estamos listos para proceder con la codificación. Comenzaremos con el AppDelegate.

Configure el delegado de la aplicación para importar la biblioteca de Realm

En nuestro AppDelegate vamos a importar la biblioteca Realm, así que agregue lo siguiente a la AppDelegate.swift expediente:

importar UIKit importar RealmSwift @UIApplicationMain class AppDelegate:… 

Deje la clase como está por ahora, para que podamos centrarnos en el objeto modelo..

Modelos de objetos en vivo

Definir modelos en Realm es muy simple; simplemente creas una clase de modelo lógico. En nuestro proyecto, vamos a almacenar recordatorios, así que vamos a crear una clase llamada Recordatorio. Cambio, con el siguiente código:

recordatorio de la clase RealmSwift: objeto dynamic var name = "" dynamic var done = false 

Para este tutorial, solo necesitamos este Recordatorio modelo, así que todos hemos terminado! Es así de simple, y crear una instancia de un modelo es igual de fácil, como veremos más adelante. 

Configurar los controladores de vista y el guión gráfico

Ahora centramos nuestra atención en los controladores de vista, pero antes de ir al MasterViewController.swift clase, abramos Main.storyboard y agrega un botón de barra en la parte superior derecha, llamado Añadir, Como se muestra abajo:

El proyecto fue inicializado por Xcode con la fuente de datos y el delegado conectado al controlador de vista, por lo que todo lo que tenemos que hacer es agregar el botón que acabamos de crear al controlador de vista como un IBOutlet. Sostenga y arrastre desde el botón al controlador de vista en modo de vista dividida, para generar el enlace.

Inicializando reino

Ahora, pasando a la MasterViewController.swift archivo, declaramos las variables que vamos a necesitar, que deberían tener un aspecto similar al siguiente:

clase MasterViewController: UITableViewController var realm: Realm! // (1) @IBOutlet weak var addButton: UIBarButtonItem! var recordatoriosLista: Resultados // (2) obtener return realm.objects (Reminder.self) anular func viewDidLoad () // (3) super.viewDidLoad () // Realizar cualquier configuración adicional después de cargar la vista, generalmente desde una plumilla . reino = intentar! Reino () ... 

Primero, en la línea (1), declaramos la variable Realm a la que vamos a hacer referencia para llegar a nuestro almacén de datos. Entonces, cargamos la perezosa lista de recordatorios llamando a los objetos de Reino para obtener una lista de todos los objetos de Recordatorio. Finalmente, instanciamos la variable de reino que declaramos al inicio. Nada demasiado complicado hasta ahora!

Configurar el delegado de vista y la fuente de datos

A continuación, configuramos nuestra tableView Métodos de delegado y fuente de datos, de la siguiente manera:

anular func numberOfSections (en tableView: UITableView) -> Int return 1 override func tableView (_ tableView: UITableView, numberOfRowsInSection sección: Int) -> Int // (4) return remindersList.count override func tableView (_ tableView : UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell let cell = tableView.dequeueReusableCell (withIdentifier: "Cell", para: indexPath) let item = remindersList [indexPath.row] cell.textLabel! .Text = item.name // (5) cell.textLabel! .TextColor = item.done == false? UIColor.black: UIColor.lightGray celda de retorno 

En la línea (4), obtenemos un conteo de la lista de recordatorios lista de objetos, que establecerá el recuento para el número de filas en nuestra sección única tableView.

Luego, para cada celda, obtenemos la Recordatorio la propiedad del objeto vivo para establecer la etiqueta, así como marcar si el elemento está marcado como hecho o no.

Escribir cambios en la base de datos

Queremos que nuestros usuarios puedan cambiar un elemento como hecho (y no hecho), lo cual indicamos al cambiar el color de la etiqueta. También queremos que la vista de la tabla sea editable (los usuarios podrán eliminar las celdas al deslizar de derecha a izquierda), lo que logramos agregando el siguiente código:

anular func tableView (_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) let item = remindersList [indexPath.row] ¡intente! self.realm.write (// (6) item.done =! item.done) // actualizar filas tableView.reloadRows (en: [indexPath], con: .automatic) sobrescribir func tableView (_ tableView: UITableView , canEditRowAt indexPath: IndexPath) -> Bool return true override func tableView (_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexParkLista de cambios de índice) ] ¡tratar! self.realm.write (self.realm.delete (item) // (7)) tableView.deleteRows (at: [indexPath], con: .automatic) 

En la línea (6), esta es la primera vez que escribimos en nuestra base de datos, lo que simplemente hace dentro de un self.realm.write bloquear. Tenga en cuenta que todo lo que necesita hacer con un objeto de instancia es establecer su valor, nada más. Así que en este caso cambiamos el valor hecho haciendo item.done =! item.done

La línea (7) es nuestro segundo ejemplo de escritura en nuestra base de datos: eliminamos un objeto de la base de datos simplemente eliminando el objeto de instancia.

Añadiendo nuevos objetos

Estamos haciendo un gran progreso y, de hecho, ¡casi hemos terminado! Ahora podemos cargar, editar y eliminar nuestros recordatorios, pero nos falta una acción importante: añadiendo un nuevo recordatorio. Para implementar esto, crea un nuevo @IBAction Método, y cablea tu guión gráfico Añadir botón de la barra de herramientas para el método. 

Vamos a construir un sencillo. AlertViewController en nuestro ejemplo, pero como un ejercicio separado, intente refinar la aplicación actualizando esto a un nuevo controlador de vista en su lugar. 

Por ahora, adelante y agregue el siguiente código:

@IBAction func addReminder (_ sender: Any) let alertVC: UIAlertController = UIAlertController (título: "New Reminder", mensaje: "¿Qué desea recordar?", PreferredStyle: .alert) alertVC.addTextField (UITextField) in  let cancelAction = UIAlertAction.init (título: "Cancel", estilo: .destructive, handler: nil) alertVC.addAction (cancelAction) // Alerta de cierre de acción let addAction = UIAlertAction.init (title: "Add", style:. por defecto) (UIAlertAction) -> Void en let textFieldReminder = (alertVC.textFields? .first)! como UITextField let reminderItem = Reminder () // (8) reminderItem.name = textFieldReminder.text! reminderItem.done = false // Estamos agregando el recordatorio a nuestra base de datos ¡intente! self.realm.write (self.realm.add (reminderItem) // (9) self.tableView.insertRows (at: [IndexPath.init (row: self.remindersList.count-1, section: 0)], con : .automatic)) alertVC.addAction (addAction) presente (alertVC, animated: true, complete: nil) 

En la línea (8), creamos una nueva instancia de recordatorio y configuramos sus propiedades. Luego, en la línea (9) agregamos el recordatorio vía self.realm.add (artículo).

Probando la aplicación

Así que probemos la aplicación, compilándola y ejecutándola en Simulator. Continúe y agregue dos recordatorios, y configure uno de ellos como hecho al tocarlo. Si sale de la aplicación y la abre de nuevo, sus elementos deberían estar allí.

Ceja del reinoser

¡Y eso es! Con poca o ninguna curva de aprendizaje, y al pasar por alto cualquiera de las complejidades de Core Data, tenemos un back-end en el dispositivo completamente horneado. Esto es Base de datos móvil de reino. También puede verificar que los datos están en el dispositivo descargando Realm Browser, una aplicación macOS que nos permite ver, depurar y editar objetos de datos de Realm.. 

Descargue la aplicación desde la Mac App Store y abra la base de datos Realm, que se encuentra en su CoreSimulator / Devices / appID / data /… carpeta. El archivo que busca es db.realm.

Al abrirlo, debería poder no solo ver sus datos, sino también editar y agregar nuevos datos. Sigue adelante e inténtalo!

Conclusión

En este tutorial, aprendiste sobre Realm Mobile Database y por qué es una herramienta poderosa para el desarrollador de iOS. También abordamos brevemente su contraparte del servidor, Realm Mobile Platform, que cubriremos en un tutorial separado.

Luego creamos una aplicación de recordatorios simple que funciona con Realm Mobile Database. En solo unas pocas docenas de líneas de código, pudimos:

  1. configurar un modelo de objeto vivo para el Recordatorio
  2. Conecte nuestro controlador de vista al modelo de datos.
  3. declarar, crear instancias, cargar, agregar y eliminar de la base de datos de Realm

Finalmente, vio cómo utilizar Realm Browser para depurar y ver sus datos..

Esta ha sido una introducción muy básica a Realm Mobile Database, pero puede usarla como punto de partida para embarcarse en temas más avanzados. Como próximos pasos, usted podría mirar:

  • El modelo de datos del reino
  • Documentación para Realm para Swift
  • Documentación para Realm para Objective-C 
  • Referencia de la API de la base de datos móvil de Realm

Asegúrese de explorar algunos de los temas avanzados en la documentación anterior, como trabajar con relaciones de datos, probar objetos de Reino, subprocesos y cifrado. 

Y mientras esté aquí, asegúrese de revisar algunas de nuestras otras publicaciones sobre el desarrollo de aplicaciones de iOS!