funcționarea CRUD folosind RealmSwift Partea 1

în această parte, vom acoperi:

  1. ce este tărâmul
  2. RealmSwift
  3. crearea unui model complex tărâm
  4. De ce folosim @objc și dinamic în proprietate
  5. To-One și To-Many relație în tărâm
  6. cum se stochează enum personalizat în tărâm
  7. ce este RealmOptional și cum se stochează Swift proprietate atomică opțională
  8. cum funcționează proprietatea calculată ca proprietate tranzitorie în tărâm
  9. cum se face indexarea pentru câștigul de performanță
  10. ce leagă obiectul în tărâm
  11. interogări complexe de predicate
  12. funcționare crudă
  13. ce este live rezultate în tărâm
  14. lucruri evitate atunci când Modificare obiecte tărâm

tărâm este o bază de date cross-platform obiect mobil. Este foarte rapid, performant și ușor de utilizat în comparație cu Core Data și SQLite. Acesta utilizează mecanismul de stocare pentru a stoca obiect ca JSON pe disc, în comparație cu datele de bază care utilizează SQLite ca backend sale. Este scris în cross-platform C++, deci funcționează exact la fel pe Android, iOS, macOS sau orice altă platformă.

RealmSwift

majoritatea tărâmului este open-source, dar sosul secret din spatele platformei tărâmului este motorul DB de bază scris de la zero în c++. RealmSwift este un înveliș în jurul cadrului Realm Objective-C și cadru Realm Objective-C este un înveliș în jurul motor Realm core DB.

Noțiuni de bază

În acest tutorial vom lucra la aceste modele așa cum se arată în Figura 1

utilizator este un model conține informații de utilizator în careuserId este primar. De asemenea, are o relație la unu cu modelul pașaportului și la multe relații cu sarcinile Todo. (Utilizatorul poate avea doar pașaport și au mai multe sarcini todo)

Passport-ul este un model conține informații pașaport al unui utilizator și are, de asemenea, un link înapoi înapoi de User obiect.

Todo este un model care conține sarcini ale unui utilizator și are, de asemenea, o legătură inversă înapoi deUser obiect.

Figura 1

model utilizator

așa cum se arată în Figura 2 am creat modelul utilizator și adaugă câteva proprietăți:

  1. mai întâi moștenimUser clasă din Object ceea ce îl face Realm Object. Obiectele Realm sunt practic un model de date standard, la fel ca orice alt model de date standard pe care l-ați definit în aplicațiile dvs. Singura diferență este că sunt susținute de persistența și abilitățile tărâmului. Analizând toateObject tărâmul clasei sunt capabili să deducă schema. Fiecare model pe care doriți să persiste trebuie să moștenească de la clasa obiect.
  2. firstName stochează prenumele utilizatorului caString. Deoarece RealmSwift este un înveliș în jurul tipurilor de cadru Obiectiv-C, cum ar fi șir, data și datele sunt sub-clase de NSObject în Objective-C, astfel încât să le puteți lua în considerare tipuri de obiecte în Swift, de asemenea. În plus față de acest @objc înseamnă că doriți codul Swift (clasă, metodă, proprietate, etc.) pentru a fi vizibil din Objective – C, în timp ce dynamic înseamnă că doriți să utilizați dispeceratul dinamic Objective-C. Pentru a face simple magazine obiect swift în domeniul bazei de date foloseste Objective-C facilitate de expediere dinamic pentru a face munca sub capota
  3. userId stochează ID-ul de utilizator care acționează ca o cheie primară. Puteți seta una dintre proprietățile obiectului dvs. ca cheie primară. De obicei, proprietate care se identifică în mod unic, care este un candidat prim pentru o cheie primară. Aceasta vă ajută să o căutare rapidă sau edita obiect într-o bază de date. Așa cum se arată în Figura 2 facem userId cheie primară prin suprascrierea primarykey funcție statică. Implementarea implicită a acestei metode returnează zero. Notă userId acționează ca un tip int primitiv Obiectiv C, deoarece este un înveliș în jurul obiectivului c Realm
  4. passport proprietatea stochează informațiile pașaportului utilizatorului care este un alt obiect Realm. Am creat o relație la unu cu modelul pașaportului. Legătură de relație / obiect la-unu , în care un obiect de tărâm indică un alt obiect de tărâm. Când creați o relație cu un alt obiect Realm, proprietatea sa trebuie să fie de tip opțional. În pașaport variabila pointer reference dePassport obiect va stoca
  5. privateUserType este proprietatea înveliș deUserType deoarece UserType este swift enum nu putem stoca direct pe tărâm. Toate valorile sale de caz ar avea o valoare brută atribuită implicit care se potrivește cu numele cazului. Veți folosi această valoare brută pentru a persista opțiunile enum ca Int în regiune. Dar clientul accesează proprietatea enum calculată și sub capotă valoarea brută enum / valoarea atomică este stocată în baza de date care nu este vizibilă pentru client.proprietățile String, NSDate și NSData pot fi declarate opționale sau non-opționale folosind sintaxa Swift standard.Tipurile numerice opționale sunt declarate folosind RealmOptional. Deoarece RealmSwift este înveliș în jurul obiectivului c Realm și nu există nici o int opțional în obiectivul C, de aceea Realm a creat Tipul RealmOptional pentru aceste scenarii. Toate Obiectiv C tip primitiv necesită în Swift cu opțional trebuie să utilizați RealmOptional . Notă: proprietățile RealmOptional nu pot fi declarate ca cuvinte cheie dinamice și @ objc, deoarece proprietățile generice nu pot fi reprezentate în runtime-ul Objective C, care este utilizat pentru expedierea dinamică a proprietăților dinamice și ar trebui să fie întotdeauna declarate cu let. Din moment ce este clasa tărâm are toate caracteristicile pe care tărâmul persista obiect au. Așa cum se arată în Figura 2 isEmailSubscriptionEnable declarăm ca RealmOptional Bool înseamnă că poate fi zero pe care l-am folosit cu let, deoarece este un tip de referință și nu dorim ca adresa sa să se schimbe în viitor.
  6. așa cum se arată în Figura 2 Utilizatorul poate avea mai multe todos, care este o colecție de obiecte Realm Todo . Listați ca clasă de tărâm pentru a păstra colecția instanțelor obiectului tărâm. Am creat pentru a-multe relație cu modelul Todo. Pentru a-multe relație, în care un punct obiect tărâm la colectarea obiectului tărâm. Dacă utilizați matrice Swift normală pentru a stoca colectare tărâm de Obiect vei primi excepție. Notă: cum ar fi lista RealmOptional nu poate fi declarat ca dinamic și @objc de cuvinte cheie din clasa sa un tărâm cu toate construit în caracteristici. Lista este foarte similar cu matrice pentru construit în metode și accesarea obiectelor folosind indexate subscripting. Lista după cum vedeți este tastat și toate obiectele ar trebui să fie de același tip
  7. isUserHasTodos este o proprietate swift calculat și nu va stoca în realm database care returnează dacă utilizatorul are unele sarcini de a face sau nu.
  8. în cele din urmă facem userId și firstName ca proprietăți indexate. Prin suprascriereaindexedProperties metoda statică oferim matrice de proprietăți în formă de șir. Facem indexate pe Proprietăți pentru a îmbunătăți timpii de acces la filtrarea sau interogarea bazei de date

figura 2

modelul pașaportului

așa cum se arată în figura 3 am creat modelul pașaportului cu câteva proprietăți

  1. passportNumber stochează informațiile pașaportului și expiryDate stochează data de expirare a pașaportului dorim ca aceste proprietăți să fie stocate de aceea utilizați @objc cu dynamic cuvinte cheie pentru a spune tărâmul face sub capota magic
  2. am creat passport proprietate pe User model care înseamnă User obiect au lor passport obiect de referință ce se întâmplă dacă vrem obiect pașaport, de asemenea, știu ce utilizator are acest pașaport / au o referință la utilizatorul asociat cu acest pașaport. Am creat backlink-uri folosind LinkingObjects ceea ce înseamnă că am creat ofUser proprietate în pașaport, care au o referință a tuturor obiectelor de utilizator care atribuie pașaport obiect în passport proprietate. În datele de bază sa numit-o ca relație inversă. Este o colecție dinamică care vă spune cine se leagă de obiectul curent.

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

am terminat cu crearea modelului / schemei și acum este timpul să facem operația brută reală

adăugați obiect la tărâm

mai întâi clarificăm un concept, apoi vom putea adăuga cu ușurință obiect în tărâm

așa cum se arată în figura 5 începem prin a obține o instanță a implicit Realm prin inițializarea fără argumente. Singurul mod în care puteți accesa baza de date prin instanță tărâm. O instanțăRealm (denumită și „A Realm”) reprezintă o bază de date Realm.Tărâmurile pot fi stocate fie pe disc (vezi init(path:)), fie în memorie (vezi Configuration) vom vedea în părțile viitoare. Realm instanțele nu sunt sigure și nu pot fi partajate între fire sau cozi de expediere. Trebuie să construiți o nouă instanță pentru fiecare fir în care va fi accesat un tărâm.

așa cum se arată în Figura 5 deoarece este o aplicație proaspătă și niciun obiect nu a fost stocat în baza de date realm.isEmpty returnează adevărat înseamnă că baza de date este goală așa cum este tipărită pe consolă

Figura 5

așa cum se arată în Figura 6 am efectuat numărul de sarcini

  1. obținem instanțaRealm baza de date
  2. creat Passport și trei sarcini ca todos
  3. creat User obiect și atribuiți pașaport și todos la acesta. În plus față de această proprietate opțional tărâm inițializat, care este isEmailSubscriptionEnable și Usertype enum cu aur de membru

așa cum se arată în Figura 6 tărâm baza de date încă gol și relație inversă/ legarea obiect nu este de lucru, fie pentru că nu am adăugat aceste obiecte la tărâm. Obiectele tărâmului (utilizator,pașaport,Todo)pot fi instanțiate și utilizate ca obiecte negestionate (adică nu au fost încă adăugate la un tărâm) la fel ca obiectele Swift obișnuite. Pentru a face teze obiecte gestionate de Realm trebuie să le adăugați în Realm

figura 6

așa cum se arată în figura 7 vom insera în cele din urmă obiect în baza de date tărâm. Am efectuat inserarea în cascadă în DB.

Notă: toate modificările aduse unui obiect (Adăugare, Modificare și ștergere) trebuie efectuate în cadrul unei tranzacții de scriere.Operațiunile de scriere a tărâmului sunt sincrone și blocante, nu asincrone. Dacă firul A începe o operație de scriere, atunci firul B începe o operație de scriere pe același tărâm înainte ca firul a să fie terminat, firul A trebuie să termine și să comită tranzacția înainte ca operația de scriere a firului b să aibă loc. Operațiunile de scriere se actualizează întotdeauna automat, astfel încât să nu se creeze nicio condiție de cursă. Operațiunea de scriere poate arunca erori precum epuizarea spațiului pe disc

  1. am adăugat utilizator în Tărâmul dvs. și, din moment ce face referire la pașaport și todos, aceste obiecte sunt adăugate și în tărâm.
  2. prin adăugarea obiect unmanaged la tărâm am făcut aceste obiecte gestionate acum așa cum se arată în consola backlink noastre funcționează. Acum passport poate accesa și obiectul utilizatorului. Acum Baza noastră de date nu mai este goală
  3. în cele din urmă inserăm obiect în baza de date, deoarece inserăm obiect pe care trebuie să-l adăugăm în blocul de tranzacții de scriere și adăugăm în tărâm folosind metoda de adăugare pe instanța de tărâm. Acum, dacă un alt obiect separat cu aceeași cheie primară a Utilizatorului cu userId = 1 este încercat să fie adăugat ca un obiect separat în regiune, o excepție va fi declanșată

figura 7

verificați obiect magazin fizic

prin rularea acestei comenzi pe ieșire depanator veți obține adresa fișierului tărâm în cazul în care datele sunt stocate

figura 8

opendefault.realm în realm Studio
Realm Studio este instrumentul nostru dezvoltator premiera, construit astfel încât să puteți gestiona cu ușurință baza de date tărâm și platforma tărâm. Cu Realm Studio, puteți deschide și edita tărâmuri locale și sincronizate și puteți administra orice instanță a serverului Realm Object. Descărcați-l acum pentru Mac, Windows sau Linux.

figura 9

așa cum se arată în figura 10 datele stocate efectiv. Poate vă întrebațiArticle șiPerson clasa de asemenea, acolo, deoarece în unele din clasa mea proiect crea modele persoană și articol. Când rulează aplicația, Realm introspectă toate clasele din aplicația și cadrele dvs. și găsește acele clase care subclasează clasa obiect Realm. Consideră că lista acestor clase este schema dvs. de date care va persista pe disc sau în memorie.

Figura 10

fetch object from realm

procesul de preluare a tuturor înregistrărilor utilizatorului din realm are următoarele sarcini

  1. obținem instanța bazei de date realm și poate arunca: un NSError dacă tărâmul nu a putut fi inițializat. Tărâmul implicit este creat atunci când apelăm init() fără parametru
  2. numită metodă obiecte pe baza de date tărâm care va returna toate obiectele de tipul dat stocate în tărâm și va returna un rezultat cu toate obiectele așa cum se arată în Figura 11
  3. obiect imprimat pe consolă pentru a valida datele există și conectarea obiectelor care funcționează bine

Figura 11

am preluat utilizatorul înregistrați din cheia primară, care este, de asemenea, o proprietate indexată, astfel încât să obținem obiectul utilizator opțional, deoarece obiectul cu această cheie primară ar putea să nu existe. Cheie primară poate fi Int sau String recomandarea este de a utiliza String. identifica în mod unic obiecte specifice într-o bază de date tărâm.Odată ce o valoare cheie primară a fost setată pe un anumit obiect, aceasta nu poate fi modificată niciodată.

Figura 12

după cum se arată, am filtrat folosind un predicat iată lista operatorilor pe care i-am folosit

  1. filtru valori egale cu
  2. caz de filtru insensibil valori egale cu caz de ignorare
  3. în {1,2,3} filtru valori identice cu valoarea dintr-o listă de valori.
  4. filtru se potrivește în cazul în care valoarea firstName începe cu un.
  5. filtru se potrivește în cazul în care valoarea firstName conatins cu li.
  6. predicat cu pașaport obiect vrem să filtreze utilizator care au pașaport număr == ‘pass1’
  7. predicat cu Todos obiect vrem să filtreze utilizator care au orice tdodo conține detalii == ‘nevoie de OT crea rxswift blog’

pentru interogări avansate este foarte recomandat pentru a vedeahttps://academy.realm.io/posts/nspredicate-cheatsheet/ această fișă de cheat nspredicate

notă: Ceea ce denumiți „proprietăți tranzitorii (calculate)”, tărâmul se referă la „proprietăți ignorate”. Acestea sunt proprietăți care sunt în cea mai mare parte ignorate de Realm, deci nu vor fi stocate în fișierul db, pot fi mutate în afara tranzacțiilor de scriere etc.Cu toate acestea, acest lucru înseamnă, de asemenea, că nu beneficiază de multe dintre capacitățile proprietăților care nu sunt ignorate, cum ar fi interogările. (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

rezultate Live

ultimul subiect despre preluarea din secțiunea tărâm

seturile de rezultate tărâm returnează întotdeauna cele mai recente date actualizate. Datele din rezultate nu sunt niciodată depășite. Aceasta înseamnă că nu trebuie să reîncărcați rezultatele de pe disc sau să reîmprospătați manual datele din memorie.

așa cum se arată în Figura 15 am primit noul utilizator și nu am adus folosindrealm.objects metoda în loc de obiect nou adăugat sunt prezentate pe utilizatori variabilă . Dacă veniți din fundalul datelor de bază, trebuie să preluați din nou obiectul din stivă

citirea și scrierea se pot întâmpla în diferite locuri din proiect, pe diferite fire, din diferite procese sau, atunci când utilizați platforma Realm, de oriunde din lume. Fiecare clasă din aplicație se poate concentra pe logica de afaceri și poate uita de noțiunea de date învechite sau memorate în cache, deoarece obiectele Realm sunt întotdeauna actualizate.

figura 15

modify object on realm

așa cum se arată în figura 16, modificăm cheia primară și obținem „cheia primară nu poate fi modificată după introducerea unui obiect.”excepție, deoarece nu putem actualiza cheia primară . Din Realm Docs cheie primară se adaugă la un tărâm, cheia primară nu poate fi modificată. Soluție → Scoateți și reintroduceți obiect sau pentru a vedea această întrebare în stackoverflow

Figura 16

după Cum se arată în Figura 17 nu puteți modifica obiect preluat din tărâm în afara de a scrie tranzacție bloc dacă încercați să modificați în afara de aceasta, veți obține excepție „‘Încercarea de a modifica obiect în afara de o scrie de tranzacție — apel beginWriteTransaction pe un RLMRealm prima instanță.”

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

ultimul exemplu este foarte interesant am efectuat următoarele sarcini pentru a actualiza utilizator cu Newuser

  1. vom obține utilizatorul cu cheia primară userId care este 1
  2. creat nou User cu aceeași cheie primară
  3. pe o tranzacție de scriere pe care o numim adăugați lot metoda de actualizare cu update = true se va actualiza utilizatorul având cheie primară = 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 conectarea la cele șterse va seta proprietatea lor de legătură la zero. Dacă aceste obiecte sunt legate de orice proprietăți listă, acestea sunt eliminate din listele în cauză.

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 obiect realm. Așa cum se arată în figura realm.isEmpty returnează adevărat

figura 24

uneori trebuie să construiți un fel de ierarhie între obiectele tărâmului, la fel cum sunteți obișnuiți să faceți cu clasele Swift. Din păcate, Realm nu acceptă în prezent moștenirea obiectelor din cutie . Soluție: 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/

Lasă un răspuns

Adresa ta de email nu va fi publicată.