En esta parte, cubriremos:
- Qué es Realm
- RealmSwift
- Creación de un Modelo de Reino Complejo
- Por qué usamos @objc y dynamic in Property
- Relación a Uno y a Muchos en Realm
- Cómo almacenar enumeración Personalizada en Realm
- Qué es RealmOptional y Cómo Almacenar la Propiedad Atómica Opcional Swift
- Cómo funciona la Propiedad Computada como Propiedad Transitoria En realm
- Cómo hacer la indexación para obtener ganancia de rendimiento
- Qué está enlazando el objeto en el Reino
- Consultas de Predicados complejos
- Operación CRUD
- Qué es Resultados en vivo en el Reino
- 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.
Modelo de usuario
Como se muestra en la Figura 2 hemos creado el modelo de Usuario y añade un par de propiedades:
- Primer heredamos
User
clase deObject
lo que haceRealm 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 claseObject
, puede inferir su esquema. Cada modelo que desee conservar debe heredarse de la clase de objeto. -
firstName
almacena el usuario primero nombreString
. Dado queRealmSwift
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ó -
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 haceruserId
clave primaria reemplazandoprimarykey
función estática. La implementación predeterminada de este método devuelve nil. NotauserId
actúa como un tipo Int primitivo de Objective C, ya que es un contenedor alrededor del Reino de Objective C -
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 dePassport
el objeto almacenará -
privateUserType
es la propiedad de envoltura deUserType
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 comoInt
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. - 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 comoRealmOptional
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. - 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
-
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. - Finalmente hacemos
userId
yfirstName
como propiedades indizadas. Al sobrescribirindexedProperties
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
Pasaporte Modelo
Como se muestra en la Figura 3 hemos creado Pasaporte con el modelo de las pocas propiedades
-
passportNumber
almacena la información del Pasaporte, yexpiryDate
almacena la fecha de vencimiento del pasaporte queremos que estas propiedades para almacenar es por eso que nos use@objc
condynamic
palabra clave para decirle a realm que haga su magia debajo del capó - Creamos
passport
propiedad enUser
modelo que significaUser
el objeto tiene supassport
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 propiedadofUser
en Passport que tiene una referencia de todos los objetos de usuario que asignan el objeto Passport en su propiedadpassport
. 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.
As shown in Figure 4 we created Todo
Realm model with has a backlink to the all the users pointing to particular task .
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
Como se muestra en la Figura 6 se realizó número de tareas
- obtenemos la instancia de
Realm
base de datos - Crea
Passport
y tres tareas como untodos
- Creado
User
objeto y asignarle pasaporte y todos. Además de esta propiedad opcional de Reino inicializado, que esisEmailSubscriptionEnable
yUsertype
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
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
- Agregamos Usuario a su Reino, y como hace referencia a passport y todos, estos objetos también se agregan al Reino.
- 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
- 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á
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
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.
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.
Fetch Objeto de Dominio
El proceso de recuperación de todos los registros de Usuario de Reino tiene las siguientes tareas
- 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étodoinit()
sin parámetro - 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
- Objeto impreso en la consola para validar que los datos estén allí y los objetos enlazados funcionen bien
Como se muestra, filtramos usando algún Predicado Aquí está la lista de operadores que usamos
- filtro → coincide con valores iguales a
- filtro insensible a mayúsculas y minúsculas → coincide con valores iguales a ignorar mayúsculas y minúsculas
- EN {1,2,3} filtro → coincide con el valor de una lista de valores.
- filter → coincide si el valor FirstName comienza con a.
- filtro → coincide si el valor de nombre se une con li.
- Predicado con objeto Passport queremos filtrar al Usuario que tenga número de pasaporte == ‘pass1’
- 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)
As shown in Figure 14 we sorted results with the firstName
property on User model
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.
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
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.»
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
el Último ejemplo, es muy interesante, hemos realizado las siguientes tareas para actualizar usuario con el usuarionuevo
- obtenemos el Usuario con su clave primaria
userId
1 - Crea nuevos
User
con la misma clave principal - 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
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’
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
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/