In questa parte, ci occuperemo:
- che Cosa è il Regno
- RealmSwift
- Creazione di un Complesso Reame Modello
- il Motivo per cui usiamo @objc e dinamico nella Struttura
- A-Uno e Relazione nel Regno
- Come per memorizzare enum Personalizzato nel Regno
- che Cosa è RealmOptional e Come Memorizzare Swift Opzionale Proprietà Atomica
- Come Calcolato Proprietà funziona come Transitori Proprietà Nel regno
- la procedura di indicizzazione per il miglioramento delle prestazioni
- che Cosa è il Collegamento Oggetto nel Regno
- Predicato Complesso Query
- CRUD Operazione
- che Cosa è i Risultati in Diretta nel Regno
- Cose evitato quando Modifica Oggetti Realm
Realm è un database di oggetti mobili multipiattaforma. È molto veloce, performante e facile da usare rispetto a Core Data e Sqlite. Utilizza il suo meccanismo di archiviazione per memorizzare l’oggetto come JSON su disco rispetto ai dati principali che utilizzano Sqlite come back-end. È scritto in C++ multipiattaforma, quindi funziona esattamente allo stesso modo su Android, iOS, macOS o qualsiasi altra piattaforma.
RealmSwift
La maggior parte di Realm è open-source, ma la salsa segreta dietro la piattaforma di Realm è il motore DB principale scritto da zero in C++. RealmSwift è un wrapper attorno al framework di Realm Objective-C e Objective-C Realm framework è un wrapper attorno al motore DB di Realm Core.
Guida introduttiva
In questo tutorial lavoreremo su questi modelli come mostrato in Figura 1
User → It’s a model contains user information in whichuserId
it’s primary. Ha anche una relazione a-uno con il modello di passaporto e a-Molte relazioni con le attività Todo. (L’utente può avere solo il passaporto e avere molte attività da fare)
Passaporto → È un modello che contiene informazioni sul passaporto di un utente e ha anche un link inverso di User
oggetto.
Todo → È un modello che contiene attività di un utente e ha anche un link inverso diUser
oggetto.
Utente Modello
Come mostrato in Figura 2 abbiamo creato un modello di Utente e aggiunge alcune caratteristiche:
- Primo abbiamo ereditato
User
classeObject
che rendeRealm Object
. Gli oggetti Realm sono fondamentalmente un modello di dati standard, proprio come qualsiasi altro modello di dati standard definito nelle tue app. L’unica differenza è che sono supportati dalla persistenza e dalle abilità del Regno. Esaminando tuttoObject
il regno di classe è in grado di dedurre il tuo schema. Ogni modello che si desidera mantenere deve ereditare dalla classe Object. -
firstName
memorizza il nome utente comeString
. PoichéRealmSwift
è un wrapper attorno ai tipi di framework del Realm Objective-C come String, Date e Data sono sottoclassi di NSObject in Objective-C, quindi puoi considerarli tipi di oggetti anche in Swift. Oltre a questo @ objc significa che vuoi il tuo codice Swift (classe, metodo, proprietà, ecc.) per essere visibile da Objective-C mentre dynamic significa che si desidera utilizzare la spedizione dinamica Objective-C. Per rendere semplici archivi di oggetti swift nel database Realm utilizza la funzione di invio dinamico Objective-C per eseguire il lavoro sotto il cofano -
userId
memorizza l’ID utente che funge da chiave primaria. È possibile impostare una delle proprietà dell’oggetto come chiave primaria. Di solito, proprietà che si identifica in modo univoco, che è un primo candidato per una chiave primaria. Ti aiuta una rapida ricerca o modifica oggetto in un database. Come mostrato in Figura 2 facciamouserId
chiave primaria sovrascrivendoprimarykey
funzione statica. L’implementazione predefinita di questo metodo restituisce nil. NotauserId
agisce come un tipo Int primitivo Objective C poiché è un wrapper attorno alla proprietà Objective C Realm -
passport
memorizza le informazioni del passaporto dell’utente che è un altro oggetto Realm. Abbiamo creato una relazione con il modello di passaporto. A-un collegamento relazione / oggetto , in cui un oggetto realm punta a un altro oggetto realm. Quando si crea una relazione con un altro oggetto Realm, la sua proprietà deve essere di tipo facoltativo. Nel riferimento del puntatore variabile passport diPassport
l’oggetto memorizzerà -
privateUserType
è la proprietà wrapper diUserType
poiché UserType è swift enum non possiamo memorizzare direttamente sul Realm. Tutti i suoi valori del caso avrebbero un valore non elaborato assegnato implicitamente che corrisponde al nome del caso. Userai questo valore grezzo per mantenere le opzioni enum comeInt
in Realm. Ma il client sta accedendo alla proprietà enum calcolata e sotto il cofano enum valore grezzo / valore atomico viene memorizzato nel database che non è visibile al client. - Le proprietà String, NSDate e NSData possono essere dichiarate opzionali o non opzionali utilizzando la sintassi Swift standard.I tipi numerici opzionali vengono dichiarati utilizzando RealmOptional. Poiché RealmSwift è wrapper attorno al Realm Objective C e non esiste un Int opzionale in Objective C, ecco perché Realm ha creato il suo tipo RealmOptional per questi scenari. Tutto il tipo primitivo Objective C richiede in Swift con opzionale è necessario utilizzare RealmOptional . Nota: le proprietà RealmOptional non possono essere dichiarate come parole chiave dynamic e @objc perché le proprietà generiche non possono essere rappresentate nel runtime Objective C, che viene utilizzato per l’invio dinamico di proprietà dinamiche e deve sempre essere dichiarato con let. Dal momento che è classe Realm ha tutte le caratteristiche che l’oggetto Realm persist ha. Come mostrato in Figura 2
isEmailSubscriptionEnable
dichiariamo comeRealmOptional
Bool significa che può essere nullo che abbiamo usato con let poiché è un tipo di riferimento e non vogliamo che il suo indirizzo cambi in futuro. - Come mostrato in Figura 2 L’utente può avere molti todos che è una raccolta di oggetti Realm Todo . Elenca come classe Realm per contenere la raccolta delle istanze dell’oggetto Realm. Abbiamo creato una relazione con il modello Todo. Relazione To-many, in cui un oggetto realm punta alla raccolta dell’oggetto realm. Se si utilizza il normale array Swift per memorizzare la raccolta di oggetti Realm, si otterrà un’eccezione. Nota: Come la lista RealmOptional non può essere dichiarata come dinamica e la parola chiave @ objc poiché è una classe Realm con tutte le funzionalità integrate. List è molto simile all’Array per i metodi integrati e l’accesso agli oggetti utilizzando l’abbonamento indicizzato. Elenco come si vede viene digitato e tutti gli oggetti dovrebbero essere dello stesso tipo
-
isUserHasTodos
è una proprietà swift calcolata e non verrà memorizzata nel database realm che restituisce se l’utente ha alcune attività da fare o meno. - Infine rendiamo
userId
efirstName
come proprietà indicizzate. SovrascrivendoindexedProperties
metodo statico forniamo array di proprietà in forma di stringa. Noi indicizzati sulla proprietà al fine di migliorare i tempi di accesso quando il filtro o l’interrogazione del database
Modello Passport
Come mostrato in Figura 3 abbiamo creato Passaporto modello con poche proprietà
-
passportNumber
memorizza delle informazioni del Passaporto eexpiryDate
memorizza la data di scadenza del passaporto vogliamo che queste proprietà per memorizzare ecco perché abbiamo utilizzare@objc
condynamic
parola chiave per indicare reame fare il vostro sotto il cofano magia - Abbiamo creato
passport
proprietàUser
modello, il che significaUser
oggetto hanno la loropassport
oggetto di riferimento che, se vogliamo passaporto oggetto anche di riconoscere l’utente che ha questo passaporto / avere un punto di riferimento per l’utente associato con questo passaporto. Abbiamo creato i backlinks usando LinkingObjects, il che significa che abbiamo creato la proprietàofUser
in Passport che ha un riferimento di tutti gli oggetti utente che assegnano l’oggetto Passport nella sua proprietàpassport
. Nei dati di base la sua chiamata come relazione inversa. È una raccolta dinamica che ti dice chi si collega all’oggetto corrente.
As shown in Figure 4 we created Todo
Realm model with has a backlink to the all the users pointing to particular task .
Abbiamo fatto con il modello / schema di creazione e ora è il momento di fare effettivo CRUD operazione
Aggiungi Oggetto Regno
il primo chiaro qualche concetto e poi saremo in grado di aggiungere facilmente un oggetto nell’area di autenticazione
Come mostrato in Figura 5 possiamo iniziare con la preparazione di una istanza di default Realm
inizializzando senza argomenti. L’unico modo è possibile accedere al database tramite istanza realm. Un’istanzaRealm
(indicata anche come “un realm”) rappresenta un database di Realm.I reami possono essere memorizzati su disco (vedi init(path:)
) o in memoria (vedi Configuration
) vedremo nelle prossime parti. Realm
le istanze non sono thread safe e non possono essere condivise tra thread o code di invio. È necessario costruire una nuova istanza per ogni thread in cui si accede a un Reame.
Come mostrato in Figura 5, poiché si tratta di una nuova app e nessun oggetto è stato archiviato nel database realm.isEmpty
restituisce true indica che il database è vuoto, come stampato sulla console
Come mostrato in Figura 6 abbiamo eseguito il numero di attività
- Abbiamo l’istanza di
Realm
database - Creazione
Passport
e tre i compiti come untodos
- Creato
User
oggetto e assegnare passaporto e todos ad esso. Oltre a questa proprietà facoltativa del realm inizializzato che èisEmailSubscriptionEnable
eUsertype
enum con gold membership
Come mostrato nella Figura 6 il database del realm è ancora vuoto e l’oggetto relazione/ collegamento inverso non funziona perché non abbiamo aggiunto questi oggetti al realm. Gli oggetti Realm (User,Passport,Todo)possono essere istanziati e utilizzati come oggetti non gestiti (cioè non ancora aggiunti a un Realm) proprio come gli oggetti Swift regolari. Per fare la tesi di oggetti gestiti da Regno è necessario aggiungere nel Regno
Come mostrato in Figura 7, infine, inserire l’oggetto nel Regno database. Abbiamo eseguito l’inserimento a cascata nel DB.
Nota: Tutte le modifiche a un oggetto (aggiunta, modifica e cancellazione) devono essere eseguite all’interno di una transazione di scrittura.Le operazioni di scrittura del realm sono sincrone e bloccanti, non asincrone. Se il thread A avvia un’operazione di scrittura, il thread B avvia un’operazione di scrittura sullo stesso Reame prima che il thread A sia terminato, il thread A deve terminare e commettere la transazione prima che l’operazione di scrittura del thread B abbia luogo. Le operazioni di scrittura si aggiornano sempre automaticamente in modo che non venga creata alcuna condizione di gara. L’operazione di scrittura può generare errori come l’esaurimento dello spazio su disco
- Abbiamo aggiunto l’utente al tuo Reame, e poiché fa riferimento a passport e todos, questi oggetti vengono aggiunti anche al Reame.
- Aggiungendo un oggetto non gestito a realm abbiamo reso questi oggetti gestiti ora come mostrato nella console i nostri backlinks funzionano. Ora passport può accedere anche all’oggetto utente. Ora il nostro database non è più vuoto
- Finalmente inseriamo l’oggetto nel database poiché stiamo inserendo l’oggetto che dobbiamo aggiungere nel blocco della transazione di scrittura e aggiungiamo nel reame usando il metodo add sull’istanza del reame. Ora, Se un altro oggetto separato con la stessa chiave primaria dell’Utente con
userId = 1
è tentato di essere aggiunto come un oggetto separato per il Regno, un’eccezione sarà attivato
Controlla Oggetto Fisicamente Store
Tramite questo comando nel debugger di output che si ottiene l’indirizzo di regno file in cui sono memorizzati i dati
Aprire
default.realm
nell’area di Studio
Area di Studio è la nostra prima developer tool, costruito in modo che si può facilmente gestire il Regno di Database e Regno Piattaforma. Con Realm Studio, è possibile aprire e modificare Realms locali e sincronizzati e amministrare qualsiasi istanza di server Oggetto Realm. Scaricalo ora per Mac, Windows o Linux.
Come mostrato in Figura 10 dati memorizzati. Potresti chiedertiArticle
ePerson
classe anche lì perché in alcune delle mie classi di progetto creare modelli Persona e Articolo. Quando l’applicazione viene eseguita, Realm introspetta tutte le classi nell’app e nei framework e trova quelle classi che sottoclassano la classe Oggetto di Realm. Considera l’elenco di queste classi come il tuo schema di dati che verrà mantenuto su disco o in memoria.
Recuperare l’Oggetto dal Regno
Il processo di recupero di tutti i record Utente da Regno ha i seguenti compiti
- Abbiamo l’esempio del Regno di Database e può tiri: Un
NSError
se il Regno non può essere inizializzato. Area di autenticazione predefinita viene creato quando si chiamainit()
senza il parametro - Chiamato oggetti metodo Regno di database che restituirà tutti gli oggetti di un determinato tipo memorizzato nel Regno e si tornerà a Risultati con tutti gli oggetti, come illustrato nella Figura 11
- oggetto Stampato sulla console per convalidare i dati e il Collegamento di oggetti di lavoro fine
Abbiamo recuperati Utente record dalla sua chiave primaria che è anche una proprietà indicizzata in modo da ottenere l’oggetto utente opzionale poiché l’oggetto con questa chiave primaria potrebbe non esistere. La chiave primaria può essere Int
o String
La raccomandazione è di utilizzare String.
Identifica in modo univoco oggetti specifici in un database di Realm.Una volta che un valore della chiave primaria è stato impostato su un oggetto specifico, non può mai essere modificato.
Come mostrato abbiamo filtrato utilizzando alcuni Predicato Ecco l’elenco degli operatori che abbiamo usato
- filtro → corrisponde a valori pari a
- filtro tra maiuscole e minuscole → corrisponde a valori pari a ignorare caso
- IN {1,2,3} filtro → corrisponde un valore da un elenco di valori.
- filtro → corrisponde se il valore FirstName inizia con a.
- filtro → confronta se il valore firstName conatins con li.
- Predicato con Passaporto oggetto che si desidera filtrare l’Utente che dispone di numero di passaporto == ‘pass1’
- Predicato con Todos oggetto che si desidera filtrare l’Utente che dispone di qualsiasi tdodo contiene dettagli == ‘Bisogno ot creare RxSwift blog’
Per query avanzate è altamente raccomandato per vedere https://academy.realm.io/posts/nspredicate-cheatsheet/ questo NSPredicate sheets
Nota: che Cosa si riferisce a come “transitoria (calcolata) proprietà”, Reame, punto di riferimento per “ignorato proprietà”. Queste sono proprietà che sono per la maggior parte ignorate da Realm, quindi non verranno memorizzate nel file db, possono essere mutate al di fuori delle transazioni di scrittura, ecc.Tuttavia, ciò significa anche che non beneficiano di molte delle funzionalità delle proprietà non ignorate, come le query. (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
Risultati live
Ultimo argomento sul recupero dalla sezione Realm
I set di risultati Realm restituiscono sempre gli ultimi dati aggiornati. I dati nei risultati non sono mai obsoleti. Ciò significa che non è mai necessario ricaricare i risultati dal disco o in qualche modo aggiornare manualmente i dati in memoria.
Come mostrato in Figura 15 abbiamo ottenuto il nuovo utente e non abbiamo recuperato utilizzando il metodo realm.objects
invece l’oggetto appena aggiunto viene presentato sulla variabile users . Se si proviene da Core data background è necessario recuperare nuovamente l’oggetto dallo stack
La lettura e la scrittura possono avvenire in diversi punti del progetto, su thread diversi, da processi diversi o, quando si utilizza la piattaforma Realm, da qualsiasi parte del mondo. Ogni classe nell’app può concentrarsi sulla logica di business e dimenticare la nozione di dati obsoleti o memorizzati nella cache, poiché gli oggetti Realm sono sempre aggiornati.
Modificare l’Oggetto Su Regno
Come mostrato in figura 16 si sta modificando la chiave primaria e ottenere la “chiave Primaria non può essere modificato dopo che un oggetto è inserito.”eccezione dal momento che non possiamo aggiornare la chiave primaria . Da Documenti Realm la chiave primaria viene aggiunta a un realm, la chiave primaria non può essere modificata. Soluzione → Rimuovere e reinserire l’oggetto o vedere questa domanda in stackoverflow
Come mostrato in Figura 17 si può modificare l’oggetto prelevato dal regno al di fuori di scrittura blocco di transazioni se si tenta di modificare al di fuori di questo si ottengono eccezione “‘il Tentativo di modificare l’oggetto al di fuori di una scrittura di transazione — chiamata beginWriteTransaction su un RLMRealm prima istanza.”
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
l’Ultimo esempio è molto interessante, abbiamo eseguito le seguenti operazioni per aggiornare l’utente, con l’newUser
- otteniamo l’Utente con la sua chiave primaria
userId
1 - Create new
User
con la stessa chiave primaria - Su una scrittura di transazione chiamiamo aggiungere batch metodo di aggiornamento con update = true aggiornerà l’utente con chiave 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 il collegamento a quelli eliminati imposterà la loro proprietà di collegamento a zero. Se tali oggetti sono collegati da qualsiasi proprietà dell’elenco, vengono rimossi dagli elenchi in questione.
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 oggetto realm. Come mostrato in Figura realm.isEmpty
restituisce true
a Volte è necessario costruire una sorta di gerarchia tra Regno oggetti, proprio come siete abituati a fare con Swift classi. Sfortunatamente, Realm attualmente non supporta l’ereditarietà degli oggetti fuori dalla scatola . Soluzione: 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/