CRUD funzionamento Utilizzando RealmSwift Parte 1

In questa parte, ci occuperemo:

  1. che Cosa è il Regno
  2. RealmSwift
  3. Creazione di un Complesso Reame Modello
  4. il Motivo per cui usiamo @objc e dinamico nella Struttura
  5. A-Uno e Relazione nel Regno
  6. Come per memorizzare enum Personalizzato nel Regno
  7. che Cosa è RealmOptional e Come Memorizzare Swift Opzionale Proprietà Atomica
  8. Come Calcolato Proprietà funziona come Transitori Proprietà Nel regno
  9. la procedura di indicizzazione per il miglioramento delle prestazioni
  10. che Cosa è il Collegamento Oggetto nel Regno
  11. Predicato Complesso Query
  12. CRUD Operazione
  13. che Cosa è i Risultati in Diretta nel Regno
  14. 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.

Figura 1

Utente Modello

Come mostrato in Figura 2 abbiamo creato un modello di Utente e aggiunge alcune caratteristiche:

  1. Primo abbiamo ereditato User classe Object che rende Realm 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 tutto Object il regno di classe è in grado di dedurre il tuo schema. Ogni modello che si desidera mantenere deve ereditare dalla classe Object.
  2. firstNamememorizza 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
  3. 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 facciamo userId chiave primaria sovrascrivendoprimarykey funzione statica. L’implementazione predefinita di questo metodo restituisce nil. Nota userId agisce come un tipo Int primitivo Objective C poiché è un wrapper attorno alla proprietà Objective C Realm
  4. 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 di Passport l’oggetto memorizzerà
  5. 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 come Int 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.
  6. 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 2isEmailSubscriptionEnable 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.
  7. 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
  8. isUserHasTodos è una proprietà swift calcolata e non verrà memorizzata nel database realm che restituisce se l’utente ha alcune attività da fare o meno.
  9. Infine rendiamo userId e firstName 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

Figura 2

Modello Passport

Come mostrato in Figura 3 abbiamo creato Passaporto modello con poche proprietà

  1. passportNumber memorizza delle informazioni del Passaporto e expiryDate memorizza la data di scadenza del passaporto vogliamo che queste proprietà per memorizzare ecco perché abbiamo utilizzare @objc con dynamic parola chiave per indicare reame fare il vostro sotto il cofano magia
  2. Abbiamo creato passport proprietà User modello, il che significa User oggetto hanno la loro passport 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.

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

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

Figura 5

Come mostrato in Figura 6 abbiamo eseguito il numero di attività

  1. Abbiamo l’istanza di Realm database
  2. Creazione Passport e tre i compiti come un todos
  3. CreatoUser oggetto e assegnare passaporto e todos ad esso. Oltre a questa proprietà facoltativa del realm inizializzato che è isEmailSubscriptionEnable e Usertype 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

Figura 6

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

  1. Abbiamo aggiunto l’utente al tuo Reame, e poiché fa riferimento a passport e todos, questi oggetti vengono aggiunti anche al Reame.
  2. 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
  3. 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

Figura 7

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

Figura 8

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.

Figura 9

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.

Figura 10

Recuperare l’Oggetto dal Regno

Il processo di recupero di tutti i record Utente da Regno ha i seguenti compiti

  1. 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 chiama init() senza il parametro
  2. 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
  3. oggetto Stampato sulla console per convalidare i dati e il Collegamento di oggetti di lavoro fine

Figura 11

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.

Figura 12

Come mostrato abbiamo filtrato utilizzando alcuni Predicato Ecco l’elenco degli operatori che abbiamo usato

  1. filtro → corrisponde a valori pari a
  2. filtro tra maiuscole e minuscole → corrisponde a valori pari a ignorare caso
  3. IN {1,2,3} filtro → corrisponde un valore da un elenco di valori.
  4. filtro → corrisponde se il valore FirstName inizia con a.
  5. filtro → confronta se il valore firstName conatins con li.
  6. Predicato con Passaporto oggetto che si desidera filtrare l’Utente che dispone di numero di passaporto == ‘pass1’
  7. 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)

Figure 13

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

Figure 14

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.

Figura 15

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

Figura 16

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.”

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

l’Ultimo esempio è molto interessante, abbiamo eseguito le seguenti operazioni per aggiornare l’utente, con l’newUser

  1. otteniamo l’Utente con la sua chiave primaria userId 1
  2. Create new User con la stessa chiave primaria
  3. 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

Figure 20

Figure 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’

Figure 22

Figure 23

As shown in Figure 24 we empty Realm database using deleteAll() method in oggetto realm. Come mostrato in Figura realm.isEmpty restituisce true

Figura 24

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/

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.