Operación CRUD Usando RealmSwift Parte 1

En esta parte, cubriremos:

  1. Qué es Realm
  2. RealmSwift
  3. Creación de un Modelo de Reino Complejo
  4. Por qué usamos @objc y dynamic in Property
  5. Relación a Uno y a Muchos en Realm
  6. Cómo almacenar enumeración Personalizada en Realm
  7. Qué es RealmOptional y Cómo Almacenar la Propiedad Atómica Opcional Swift
  8. Cómo funciona la Propiedad Computada como Propiedad Transitoria En realm
  9. Cómo hacer la indexación para obtener ganancia de rendimiento
  10. Qué está enlazando el objeto en el Reino
  11. Consultas de Predicados complejos
  12. Operación CRUD
  13. Qué es Resultados en vivo en el Reino
  14. Modificar objetos de reino

Reino es una base de datos de objetos móviles multiplataforma. Es muy rápido, eficiente y fácil de usar en comparación con Core Data y Sqlite. Utiliza su mecanismo de almacenamiento para almacenar objetos como JSON en el disco en comparación con los datos Principales que utilizan Sqlite como su backend. Está escrito en C++ multiplataforma, por lo que funciona exactamente de la misma manera en Android, iOS, macOS o cualquier otra plataforma.

RealmSwift

La mayor parte de Realm es de código abierto, pero la salsa secreta detrás de la plataforma de Realm es el motor de base de datos Principal escrito desde cero en C++. RealmSwift es un envoltorio alrededor del framework de Reino de Objective-C y el framework de reino de Objective-C es un envoltorio alrededor del motor de base de datos de núcleo de reino.

Primeros pasos

En este tutorial trabajaremos en estos modelos como se muestra en la Figura 1

Usuario → Es un modelo que contiene información de usuario en la que userId es principal. También tiene una relación personalizada con el modelo de pasaporte y Muchas relaciones con las tareas pendientes. (El usuario solo puede tener pasaporte y tener muchas tareas pendientes)

Pasaporte → Es un modelo que contiene información de pasaporte de un usuario y también tiene un enlace inverso de User objeto.

Todo → Es un modelo que contiene tareas de un usuario y también tiene un enlace inverso deUser objeto.

Figura 1

Modelo de usuario

Como se muestra en la Figura 2 hemos creado el modelo de Usuario y añade un par de propiedades:

  1. Primer heredamos User clase de Object lo que hace Realm Object . Los objetos de reino son básicamente un modelo de datos estándar, al igual que cualquier otro modelo de datos estándar que haya definido en sus aplicaciones. La única diferencia es que están respaldados por la persistencia y las habilidades del Reino. Al buscar en todos los dominios de clase Object, puede inferir su esquema. Cada modelo que desee conservar debe heredarse de la clase de objeto.
  2. firstName almacena el usuario primero nombre String. Dado que RealmSwift es un contenedor alrededor del marco de trabajo de Objective-C Realm, los tipos como String, Date y Data son subclases de NSObject en Objective-C, por lo que también puede considerarlos tipos de objetos en Swift. Además de esto, @objc significa que desea su código Swift (clase, método, propiedad, etc.).) para ser visible desde Objective-C, mientras que dinámico significa que desea usar Objective-C dynamic dispatch. Para simplificar los almacenes de objetos swift en el reino de la base de datos, utiliza la función de despacho dinámico Objective-C para trabajar bajo el capó
  3. userId almacena el id de usuario que actúa como clave primaria. Puede establecer una de las propiedades de su objeto como clave principal. Por lo general, la propiedad que se identifica de forma única, que es un candidato principal para una clave primaria. Le ayuda a realizar una búsqueda rápida o editar objetos en una base de datos. Como se muestra en la Figura 2 podemos hacer userId clave primaria reemplazando primarykey función estática. La implementación predeterminada de este método devuelve nil. Nota userId actúa como un tipo Int primitivo de Objective C, ya que es un contenedor alrededor del Reino de Objective C
  4. passport la propiedad almacena la información del pasaporte de usuario, que es otro objeto de Reino. Creamos una relación única con el Modelo de Pasaporte. Relación a-uno / enlace de objeto, en el que un objeto de reino apunta a otro objeto de reino. Cuando se crea una relación con otro objeto Realm, su propiedad debe ser de tipo opcional. En la referencia de puntero de variable de pasaporte de Passport el objeto almacenará
  5. privateUserTypees la propiedad de envoltura de UserType dado que UserType es una enumeración rápida, no podemos almacenar directamente en Realm. Todos sus valores de mayúsculas y minúsculas tendrían un valor sin procesar asignado implícitamente que coincida con el nombre del caso. Usarás este valor sin procesar para mantener las opciones de enumeración como Int en Realm. Pero el cliente está accediendo a la propiedad de enumeración calculada y, bajo el capó, el valor bruto de enumeración / valor atómico se almacena en la base de datos que no es visible para el cliente.
  6. Las propiedades String, NSDate y NSData se pueden declarar como opcionales o no utilizando la sintaxis Swift estándar.Los tipos numéricos opcionales se declaran utilizando RealmOptional. Dado que RealmSwift es un contenedor alrededor del Reino de Objetivo C y no hay Int opcional en el Objetivo C, es por eso que Realm creó su tipo RealmOptional para estos escenarios. Todo el tipo primitivo de Objective C requiere en Swift con Opcional tienes que usar RealmOptional . Nota: Las propiedades de RealmOptional no se pueden declarar como palabra clave dinámica y @objc porque las propiedades genéricas no se pueden representar en el tiempo de ejecución de Objective C, que se utiliza para el envío dinámico de propiedades dinámicas, y siempre se deben declarar con let. Dado que es clase Realm, tiene todas las características que tiene el objeto persist de reino. Como se muestra en la Figura 2 isEmailSubscriptionEnable declaramos como RealmOptional Bool significa que puede ser nil que usamos con let ya que es un tipo de referencia y no queremos que su dirección cambie en el futuro.
  7. Como se muestra en la Figura 2, el usuario puede tener muchos todos, que es una colección de objetos Todo de Reino . Listar como clase de reino para contener la colección de las instancias de objeto de Reino. Creamos una relación de To-Many con el modelo Todo. Relación con muchos, en la que un objeto de reino apunta a la colección de objetos de reino. Si utiliza una matriz Swift normal para almacenar una colección de objetos de Reino, obtendrá una excepción. Nota: Like RealmOptional List no se puede declarar como palabra clave dinámica y @objc, ya que es una clase de Reino con todas las características integradas. La lista es muy similar a la Matriz para los métodos integrados y el acceso a los objetos mediante subíndices indexados. List as you see se escribe y todos los objetos deben ser del mismo tipo
  8. isUserHasTodos es una propiedad swift calculada y no se almacenará en la base de datos realm que devuelve si el usuario tiene algunas tareas que hacer o no.
  9. Finalmente hacemos userId y firstName como propiedades indizadas. Al sobrescribir indexedProperties método estático, proporcionamos una matriz de propiedades en forma de cadena. Softonic indexado en propiedades para mejorar los tiempos de acceso al filtrar o consultar la base de datos

Figura 2

Pasaporte Modelo

Como se muestra en la Figura 3 hemos creado Pasaporte con el modelo de las pocas propiedades

  1. passportNumber almacena la información del Pasaporte, y expiryDate almacena la fecha de vencimiento del pasaporte queremos que estas propiedades para almacenar es por eso que nos use @objc con dynamic palabra clave para decirle a realm que haga su magia debajo del capó
  2. Creamos passport propiedad en User modelo que significa User el objeto tiene su passport referencia de objeto qué pasa si queremos un objeto pasaporte también sepa qué usuario tiene este pasaporte / tenga una referencia al usuario asociado con este pasaporte. Creamos los backlinks utilizando LinkingObjects, lo que significa que creamos la propiedad ofUser en Passport que tiene una referencia de todos los objetos de usuario que asignan el objeto Passport en su propiedad passport. En los Datos centrales se llama relación inversa. Es una colección dinámica que te dice quién enlaza con el objeto actual.

Figure 3

As shown in Figure 4 we created Todo Realm model with has a backlink to the all the users pointing to particular task .

Figura 4

Terminamos con la creación del modelo / esquema y ahora es el momento de hacer la operación CRUD real

Agregar objeto al reino

Primero borramos algún concepto y luego podremos agregar fácilmente un objeto en el Reino

Como se muestra en la Figura 5, comenzamos obteniendo una instancia del valor predeterminado Realm inicializándolo sin argumentos. La única forma de acceder a la base de datos a través de la instancia de realm. Una instancia Realm (también conocida como «un reino») representa una base de datos de reinos.Los reinos se pueden almacenar en disco (ver init(path:)) o en memoria (ver Configuration), lo veremos en las próximas partes. Realm las instancias no son seguras para subprocesos y no se pueden compartir entre subprocesos o colas de despacho. Debes construir una nueva instancia para cada hilo en el que se acceda a un Reino.

Como se muestra en la Figura 5, ya que es un fresco de la aplicación y no el objeto se almacena en la base de datos realm.isEmpty devuelve true significa que la base de datos está vacía, como impreso en la consola

Figura 5

Como se muestra en la Figura 6 se realizó número de tareas

  1. obtenemos la instancia de Realm base de datos
  2. Crea Passport y tres tareas como un todos
  3. Creado User objeto y asignarle pasaporte y todos. Además de esta propiedad opcional de Reino inicializado, que es isEmailSubscriptionEnable y Usertype enumeración con membresía dorada

, como se muestra en la Figura 6, la base de datos de reino sigue vacía y el objeto de relación/ enlace inverso tampoco funciona porque no agregamos estos objetos al reino. Los objetos de reino (User,Passport,Todo)se pueden crear instancias y usar como objetos no administrados (es decir, que aún no se han agregado a un Reino) al igual que los objetos Swift normales. Para hacer la tesis de que los objetos sean administrados por el Reino tiene que agregar en Reino

Figura 6

Como se muestra en la Figura 7 que finalmente insertar objeto en el Reino de la base de datos. Realizamos inserciones en cascada en la base de datos.

Nota: Todos los cambios en un objeto (adición, modificación y eliminación) deben realizarse dentro de una transacción de escritura.Las operaciones de escritura de reino son sincrónicas y de bloqueo, no asíncronas. Si el hilo A inicia una operación de escritura, entonces el hilo B inicia una operación de escritura en el mismo Reino antes de que finalice el hilo A, el hilo A debe terminar y confirmar su transacción antes de que se lleve a cabo la operación de escritura del hilo B. Las operaciones de escritura siempre se actualizan automáticamente para que no se cree ninguna condición de carrera. La operación de escritura puede generar errores, como quedarse sin espacio en disco

  1. Agregamos Usuario a su Reino, y como hace referencia a passport y todos, estos objetos también se agregan al Reino.
  2. Al agregar objetos no administrados al reino, hicimos que estos objetos se administraran ahora como se muestra en la consola, nuestros vínculos de retroceso funcionan. Ahora passport también puede acceder a objetos de usuario. Ahora nuestra base de datos ya no está vacía
  3. Finalmente insertamos un objeto en la base de datos ya que estamos insertando un objeto que tenemos que agregar en el bloque de transacción de escritura y agregamos al reino usando el método add en la instancia del reino. Ahora bien, Si otro objeto con la misma clave principal de Usuario con la etiqueta userId = 1 se intenta ser añadido como un objeto independiente para el Reino, una excepción se activará

Figura 7

Comprobar Físicamente el Objeto de la Tienda

Al ejecutar este comando en la salida del depurador obtener la dirección del reino de archivo donde se almacenan los datos

Figura 8

Abrir default.realm en el dominio de Estudio
Reino Studio es nuestro estreno herramienta de desarrollador, construido de modo que usted puede manejar fácilmente el Reino de la Base de datos y el Reino de la Plataforma. Con Realm Studio, puede abrir y editar reinos locales y sincronizados, y administrar cualquier instancia de Servidor de objetos de Reino. Descárguelo ahora para Mac, Windows o Linux.

Figura 9

Como se muestra en la Figura 10 datos almacenados. Puede que te preguntes Article y Person class también porque en algunas de mis clases de proyecto crear modelos Persona y Artículo. Cuando se ejecuta la aplicación, Realm hace una introspección de todas las clases de la aplicación y los frameworks y encuentra las clases que agrupan la clase objeto de Realm. Considera que la lista de estas clases es su esquema de datos que se conservará en disco o en memoria.

Figura 10

Fetch Objeto de Dominio

El proceso de recuperación de todos los registros de Usuario de Reino tiene las siguientes tareas

  1. Tenemos el ejemplo de Reino de la Base de datos y puede tiros: Un NSError si el Reino no se pudo inicializar. El dominio predeterminado se crea cuando llamamos al método init() sin parámetro
  2. Objetos llamados en la base de datos del Reino, que devolverá todos los objetos del tipo dado almacenados en el Reino y devolverá un Resultado con todos los objetos como se muestra en la Figura 11
  3. Objeto impreso en la consola para validar que los datos estén allí y los objetos enlazados funcionen bien

Figura 11

Hemos obtenido el usuario registro de su clave primaria, que también es una propiedad indexada, por lo que obtenemos el objeto de usuario opcional, ya que es posible que el objeto con esta clave primaria no exista. La clave primaria puede ser Int o StringLa recomendación es usar String. Identifica de forma única objetos específicos en una base de datos de reino.Una vez que se ha establecido un valor de clave primaria en un objeto específico, nunca se puede cambiar.

Como se muestra, filtramos usando algún Predicado Aquí está la lista de operadores que usamos

  1. filtro → coincide con valores iguales a
  2. filtro insensible a mayúsculas y minúsculas → coincide con valores iguales a ignorar mayúsculas y minúsculas
  3. EN {1,2,3} filtro → coincide con el valor de una lista de valores.
  4. filter → coincide si el valor FirstName comienza con a.
  5. filtro → coincide si el valor de nombre se une con li.
  6. Predicado con objeto Passport queremos filtrar al Usuario que tenga número de pasaporte == ‘pass1’
  7. Predicado con objeto Todos queremos filtrar al usuario que tenga cualquier tdodo contiene detalles == ‘Necesita crear blog RxSwift’

Para consultas avanzadas Es muy recomendable ver https://academy.realm.io/posts/nspredicate-cheatsheet/ esta hoja de trucos de NSPredicate

Nota: A lo que se refiere como «propiedades transitorias (calculadas)», Realm se refiere como «propiedades ignoradas». Estas son propiedades que en su mayor parte son ignoradas por Realm, por lo que no se almacenarán en el archivo db, se pueden mutar fuera de las transacciones de escritura, etc.Sin embargo, esto también significa que no se benefician de muchas de las capacidades de propiedades no ignoradas, como las consultas. (querying for Realm objects can only be done with non-computed, Realm-persisted properties)

Figure 13

As shown in Figure 14 we sorted results with the firstName property on User model

Figure 14

Resultados en vivo

Último tema sobre la obtención de la sección de reino

Los conjuntos de resultados de reino siempre devuelven los últimos datos actualizados. Los datos en los resultados nunca están desactualizados. Esto significa que nunca tendrá que volver a cargar los resultados desde el disco o actualizar manualmente los datos en memoria de alguna manera.

Como se muestra en la Figura 15, obtuvimos el nuevo usuario y no obtuvimos el método realm.objects en lugar de objetos recién agregados se presentan en la variable usuarios . Si proviene del fondo de datos del núcleo, necesita recuperar de nuevo el objeto de la pila

La lectura y escritura pueden ocurrir en diferentes lugares del proyecto, en diferentes subprocesos, desde diferentes procesos o, al usar la plataforma Realm, desde cualquier parte del mundo. Cada clase de la aplicación puede centrarse en la lógica de negocio y olvidarse de la noción de datos obsoletos o almacenados en caché, ya que los objetos de Realm siempre están actualizados.

Figura 15

Modificar el Objeto En el dominio

Como se muestra en la figura 16 estamos modificando la clave primaria y obtenemos una «clave Principal no puede ser cambiado después de que un objeto se inserta.»excepción ya que no podemos actualizar la clave primaria . Desde Documentos de reino, la clave primaria se agrega a un Reino, la clave primaria no se puede cambiar. Solución → Extraiga y vuelva a insertar el objeto o ver esta pregunta en stackoverflow

Figura 16

Como se muestra en la Figura 17 se pueden modificar los objetos obtenidos de reino fuera de escribir bloque de transacciones si intenta modificar fuera de este obtendrá excepción «‘Intentar modificar el objeto fuera de una escritura de transacción llamada beginWriteTransaction en un RLMRealm primera instancia.»

Figure 17

As shown in Figure 18 as we modify object in write transaction block it will persist that object into the disk as well as shown in Figure 19 default.realm file now has a updated firstName value of User

Figura 18

Figura 19

el Último ejemplo, es muy interesante, hemos realizado las siguientes tareas para actualizar usuario con el usuarionuevo

  1. obtenemos el Usuario con su clave primaria userId 1
  2. Crea nuevos User con la misma clave principal
  3. En una escritura de transacción llamamos agregar lote método de actualización con update = true actualizará al Usuario con clave primaria = 1 . If update = false it will throw an exception since two objects can’t have same primary key as shown in Figure 20 and 21

Figure 20

Figure 21

Delete Object From Realm

Any objects currently el enlace a los eliminados establecerá su propiedad de enlace en nil. Si esos objetos están vinculados desde cualquier propiedad de lista, se eliminan de las listas en cuestión.

As shown in Figure 22 and 23 we deleted User object having firstName == ‘ali new User’

Figure 22

Figure 23

As shown in Figure 24 we empty Realm database using deleteAll() method in objeto realm. Como se muestra en la Figura realm.isEmpty devuelve true

Figura 24

a Veces, usted necesita para construir algún tipo de jerarquía entre el Reino de los objetos, al igual que usted está acostumbrado a hacer con Swift clases. Desafortunadamente, Realm actualmente no admite la herencia de objetos de forma inmediata . transitoria: https://forum.realm.io/t/inheritance-with-realm-confusion/153

Useful Links

https://www.raywenderlich.com/9220-realm-tutorial-getting-started
https://www.appcoda.com/realm-database-swift/

https://realm.io/docs/swift/latest/#to-many-relationships
https://realm.io/docs/swift/latest/#optional-properties

https://academy.realm.io/posts/nspredicate-cheatsheet/

https://academy.realm.io/posts/nspredicate-cheatsheet/

Deja una respuesta

Tu dirección de correo electrónico no será publicada.