în această parte, vom acoperi:
- ce este tărâmul
- RealmSwift
- crearea unui model complex tărâm
- De ce folosim @objc și dinamic în proprietate
- To-One și To-Many relație în tărâm
- cum se stochează enum personalizat în tărâm
- ce este RealmOptional și cum se stochează Swift proprietate atomică opțională
- cum funcționează proprietatea calculată ca proprietate tranzitorie în tărâm
- cum se face indexarea pentru câștigul de performanță
- ce leagă obiectul în tărâm
- interogări complexe de predicate
- funcționare crudă
- ce este live rezultate în tărâm
- 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.
model utilizator
așa cum se arată în Figura 2 am creat modelul utilizator și adaugă câteva proprietăți:
- mai întâi moștenim
User
clasă dinObject
ceea ce îl faceRealm 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. -
firstName
stochează prenumele utilizatorului caString
. DeoareceRealmSwift
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 -
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 facemuserId
cheie primară prin suprascriereaprimarykey
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 -
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 -
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 caInt
î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 2isEmailSubscriptionEnable
declarăm caRealmOptional
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. - 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
-
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. - în cele din urmă facem
userId
șifirstName
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
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ă
așa cum se arată în Figura 6 am efectuat numărul de sarcini
- obținem instanța
Realm
baza de date - creat
Passport
și trei sarcini catodos
- 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 esteisEmailSubscriptionEnable
șiUsertype
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
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
- 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.
- 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ă
- î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ă
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
open
default.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.
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
- 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ăminit()
fără parametru - 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
- 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
- filtru valori egale cu
- caz de filtru insensibil valori egale cu caz de ignorare
- în {1,2,3} filtru valori identice cu valoarea dintr-o listă de valori.
- filtru se potrivește în cazul în care valoarea firstName începe cu un.
- filtru se potrivește în cazul în care valoarea firstName conatins cu li.
- predicat cu pașaport obiect vrem să filtreze utilizator care au pașaport număr == ‘pass1’
- 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)
As shown in Figure 14 we sorted results with the firstName
property on User model
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.
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
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ță.”
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
ultimul exemplu este foarte interesant am efectuat următoarele sarcini pentru a actualiza utilizator cu Newuser
- vom obține utilizatorul cu cheia primară
userId
care este 1 - creat nou
User
cu aceeași cheie primară - 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
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’
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
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/