i denne delen Vil Vi Dekke:Realmswift
Realm Er en mobil objektdatabase på tvers av plattformer. Det er veldig rask, performant og enkel å bruke i forhold Til Kjernedata og Sqlite. Den bruker sin lagringsmekanisme for å lagre objekt SOM JSON på disk i forhold Til Kjernedata som bruker Sqlite som sin backend. Den er skrevet I c++ på Tvers Av plattformer, slik at den fungerer akkurat på Samme Måte På Android, iOS, macOS eller annen plattform.
RealmSwift
Det Meste av Realm er åpen kildekode, men den hemmelige sausen bak Realms plattform er KJERNEN DB-motoren skrevet fra bunnen Av I C++. RealmSwift er en wrapper rundt Objective-C Realm framework og Objective-C Realm framework er en wrapper rundt Realm CORE DB engine.
Komme I Gang
i denne opplæringen vil vi jobbe med disse modellene som vist i Figur 1
Bruker → det Er en modell inneholder brukerinformasjon der userId
det er primært. Det har også En To-one forhold til pass modell Og Til-Mange relasjoner Med Todo oppgaver. (Brukeren kan bare ha pass og har mange todo Oppgaver)
Passport → det er en modell som inneholder passinformasjon om en bruker og har også en omvendt tilbakelenke tilUser
objekt.
Todo → det er en modell som inneholder oppgaver av en bruker og har også en omvendt lenke tilUser
objekt.
brukermodell
som vist i figur 2 opprettet vi brukermodell og legger til noen egenskaper:
- først arver vi
User
klasse fraObject
som gjør detRealm Object
. Realm-objekter er i utgangspunktet en standard datamodell, akkurat som alle andre standard datamodeller du har definert i appene dine. Den eneste forskjellen er at de støttes av Realm utholdenhet og evner. Ved å se på alleObject
klasse Riket er i stand til å utlede skjemaet. Hver modell du vil fortsette, må du arve Fra Objektklasse. -
firstName
lagrer brukerens fornavn somString
. SidenRealmSwift
er en wrapper rundt Objective-C Realm framework Typer Som Streng, Dato Og Data er underklasser Av NSObject I Objective-C, så du kan også vurdere dem objekttyper I Swift. I tillegg til dette @objc betyr at Du vil Ha Din Swift-kode(klasse, metode, eiendom, etc.) for å være synlig Fra Objective-C, mens dynamic betyr at Du vil bruke Objective-c dynamic dispatch. For å lage enkle swift-objektlagre i databaseområdet bruker Objective-c dynamic dispatch-funksjonen til å gjøre arbeid under hetten -
userId
lagrer Bruker-iden som fungerer som en primærnøkkel. Du kan angi en av objektets egenskaper som primærnøkkel. Vanligvis er eiendom som unikt identifiserer seg selv, en førsteklasses kandidat for en primærnøkkel. Det hjelper deg en rask oppslag eller redigere objekt i en database. Som vist I Figur 2 lager viuserId
primærnøkkel ved å overstyreprimarykey
statisk funksjon. Standard implementering av denne metoden returnerer null. MerkuserId
fungerer Som En Objektiv c primitiv Int-type siden det er en wrapper rundt Objective C Realm -
passport
eiendom lagrer brukerpassinformasjonen som er et Annet Realm-Objekt. Vi opprettet Et forhold til Passmodellen. Til-ett forhold / objekt link, der ett område objekt peker til et annet område objekt. Når du oppretter en relasjon med et Annet Område-objekt, må egenskapen Være Av En Valgfri type. I pass variabel pekeren referanse avPassport
objektet vil lagre -
privateUserType
er wrapper eiendom avUserType
Siden UserType er rask enum kan vi ikke lagre direkte På Riket. Alle saksverdiene vil ha en implisitt tildelt råverdi som samsvarer med sakens navn. Du bruker denne råverdien til å fortsette enum-alternativene somInt
i Område. Men klienten har tilgang beregnet enum eiendom og under panseret enum rå verdi / atom verdi er lagring i databasen som ikke er synlig for klienten. - Streng -, NSDate-og nsdata-egenskaper kan deklareres som valgfrie eller ikke-valgfrie ved hjelp av Standard Swift-syntaks.Valgfrie numeriske typer deklareres ved Hjelp Av RealmOptional. Siden RealmSwift er wrapper rundt Objective C Realm, og det er ingen valgfri Int I Objective C, er Det Derfor Realm opprettet det er Type RealmOptional for disse scenariene. Alle Objective c primitive typen krever I Swift Med Valgfritt du må bruke RealmOptional . Merk: RealmOptional egenskaper kan ikke deklareres som dynamisk og @ objc søkeord fordi generiske egenskaper ikke kan representeres I Objective c runtime, som brukes for dynamisk sending av dynamiske egenskaper, og bør alltid deklareres med let. Siden Det Er Realm klasse den har alle funksjoner Som Realm vedvarer objekt har. Som vist i Figur 2
isEmailSubscriptionEnable
vi erklærer somRealmOptional
Bool betyr at Det kan være null vi brukte med la siden det er en referansetype, og vi vil ikke at adressen skal endres i fremtiden. - Som vist I Figur 2 Brukeren Kan ha mange todos som er en samling Av Realm Todo Objekter . Liste Som Realm klasse for å holde samling Av Realm Objekt forekomster. Vi opprettet To-Mange forhold Til Todo-modellen. Til-mange forhold, hvor ett realm objekt peker på samling av realm objekt. Hvis du bruker normal Swift array til å lagre Realm samling Av Objekt, får du unntak. Merk: Som RealmOptional List kan ikke deklareres som dynamic og @ objc søkeord siden det er En Realm klasse med alle de innebygde funksjoner. List er svært lik Array for innebygde metoder og tilgang til objekter ved hjelp av indeksert abonnement. Liste som du ser er skrevet og alle objekter skal være av samme type
-
isUserHasTodos
er en beregnet swift eiendom og vil ikke lagre i realm database som returnerer hvis brukeren har noen oppgaver å gjøre eller ikke. - endelig gjør vi
userId
ogfirstName
som indekserte egenskaper. Ved å overstyreindexedProperties
statisk metode gir vi en rekke egenskaper i Strengform. Vi gjør indeksert på egenskaper for å forbedre tilgangstidene når du filtrerer eller spør databasen
passmodell
som vist i figur 3 opprettet vi passmodell med de få egenskapene
-
passportNumber
lagrer passinformasjonen ogexpiryDate
lagrer utløpsdatoen for passet vi vil at disse egenskapene skal lagre derfor vi bruk@objc
meddynamic
søkeord for å fortelle realm gjøre din under panseret magi - vi opprettet
passport
eiendom påUser
modell som betyrUser
objektet har sinpassport
objektreferanse hva om vi vil ha passobjekt vet også hvilken bruker som har dette passet / har en referanse til brukeren Som Er Knyttet til dette passet. Vi opprettet tilbakekoblingene ved Hjelp Av LinkingObjects, noe som betyr at vi opprettetofUser
eiendom I Passport som har en referanse til Alle brukerobjekter som tilordner Passobjekt i sinpassport
eiendom. I Kjernedata kalles det som omvendt forhold. Det er en dynamisk samling som forteller deg hvem som lenker til gjeldende objekt.
As shown in Figure 4 we created Todo
Realm model with has a backlink to the all the users pointing to particular task .
vi har gjort med modell/skjema skapelse og nå er det på tide å gjøre selve crud operasjon
legg objekt til realm
vi først fjerne noen konsept da vil vi være i stand til enkelt å legge objekt i realm
som vist i figur 5 vi starter ved å få en forekomst av standard Realm
ved å initialisere det uten noen argumenter. Den eneste måten du kan få tilgang til databasen gjennom realm eksempel. EnRealm
– forekomst (også referert til som «Et Område») representerer En Områdedatabase.Realms kan enten lagres på disken (se init(path:)
) eller i minnet (se Configuration
) vi vil se i kommende deler. Realm
forekomster er ikke trådsikre og kan ikke deles på tvers av tråder eller utsendingskøer. Du må konstruere en ny forekomst for hver tråd der Et Område vil bli åpnet.
som vist I Figur 5 siden det er en ny app og ingen objekt ble lagret i databasen realm.isEmpty
returnerer sant betyr databasen er tom som skrives ut på konsollen
som vist i figur 6 utførte vi antall oppgaver
- vi får forekomsten av
Realm
database - opprettet
Passport
og tre oppgaver som entodos
- Opprettet
User
objekt og tilordne pass og todos til det. I tillegg til denne initialiserte Realm valgfrie egenskapen som erisEmailSubscriptionEnable
ogUsertype
enum med gullmedlemskap
som vist i figur 6 realm database fortsatt tom og omvendt forhold/ Linking objekt fungerer ikke enten fordi vi ikke har lagt disse objektene til riket. Realm objekter (Bruker,Passport,Todo)kan instantiated og brukes som ustyrte objekter (dvs. ennå ikke lagt til Et Rike) akkurat som vanlige Swift objekter. For å gjøre disse objektene administrert Av Riket må du legge dem til I Riket
som vist i figur 7 setter vi endelig inn objekt i realm database. Vi utførte cascading sett inn I DB.
Merk: alle endringer i et objekt (tillegg, endring og sletting) må gjøres innen en skrivetransaksjon.Realm skriveoperasjoner er synkron og blokkering, ikke asynkron. Hvis tråd a starter en skriveoperasjon, starter tråd B en skriveoperasjon på samme Område før tråd A er ferdig, må tråd A fullføre og forplikte transaksjonen før tråd Bs skriveoperasjon finner sted. Skriveoperasjoner oppdateres alltid automatisk, Slik At ingen raseforhold opprettes. Skriveoperasjon kan kaste feil som å gå tom for diskplass
- vi har lagt Til Bruker i Riket ditt, Og siden det refererer til pass og todos, blir disse objektene også lagt til Riket.
- ved å legge ustyrt objekt til realm Vi Gjort disse objektene Forvaltes nå som vist i konsollen våre backlinks fungerer. Nå kan passport også få Tilgang Til Brukerobjekt. Nå er vår database ikke mer tom
- vi setter endelig inn objekt i databasen siden vi setter inn objekt vi må legge til i skrivetransaksjonsblokken, og vi legger til i riket ved å bruke add-metoden på Realm-forekomsten. Nå hvis et annet separat objekt med samme primærnøkkel Av Brukeren med
userId = 1
er forsøkt å bli lagt til som et eget objekt Til Riket, vil et unntak utløses
sjekk objekt fysisk lagre
ved å kjøre denne kommandoen på debugger utgang får du adressen til riket fil hvor dataene er lagret
åpne
default.realm
i realm studio
realm studio er vår premiere utvikler verktøy, bygget slik at du enkelt kan administrere realm database og realm plattform. Med Realm Studio kan du åpne og redigere lokale Og synkroniserte Riker, og administrere Alle Realm Object Server-instanser. Last den ned nå For Mac, Windows eller Linux.
som vist i figur 10 data som faktisk er lagret. Du lurer kanskje på Article
og Person
klasse også der fordi i noen av prosjektklassen min lager modeller Person Og Artikkel. Når programmet kjører, Realm introspects alle klassene i appen og rammer og finner de klassene som Underklasse Realms Objektklasse. Det anser listen over disse klassene å være dataskjemaet som vil bli vedvarende på disk eller i minnet.
hent objekt fra realm
prosessen med å hente alle brukerposter fra realm har følgende oppgaver
- vi får forekomsten av realm database og den kan kaste: en
NSError
hvis riket ikke kunne initialiseres. Standardområdet opprettes når vi kallerinit()
Uten parameter - kalt objekter metode På Realm database som vil returnere alle objekter av den gitte typen lagret i Riket, og det vil returnere Et Resultat med alle objektene som vist I Figur 11
- Trykt objekt på konsollen for å validere data er der og Koble objekter som fungerer fint
vi hentet bruker ta opp fra primærnøkkelen, som også er en indeksert egenskap, slik at vi får det valgfrie Brukerobjektet siden objekt med denne primærnøkkelen kanskje ikke eksisterer. Primærnøkkel kan være Int
eller String
anbefalingen er å bruke String.
den identifiserer unike objekter i En Områdedatabase.Når en primærnøkkelverdi er angitt på et bestemt objekt, kan den aldri endres.
som vist filtrerte vi ved hjelp av noen predikater her er listen over operatører vi brukte
- filter → matcher verdier lik
- filter små og små bokstaver matcher verdier lik ignorer små og store bokstaver
- i {1,2,3} filter → matcher verdi fra en liste over verdier.
- filter → matcher hvis fornavnverdien starter med a.
- filter → matcher hvis fornavnverdien conatins med li.
- Predikat Med Passobjekt vi vil filtrere Bruker Som har passnummer == ‘pass1’
- Predikat Med Todos objekt vi vil filtrere Bruker som har noen Tdodo inneholder detaljer == ‘Trenger ot opprett rxswift blogg’
for avanserte spørsmål anbefales det å sehttps://academy.realm.io/posts/nspredicate-cheatsheet/ dette nspredicate cheatsheet
merk: Det Du refererer til som «forbigående (beregnede) Egenskaper», Refererer Realm til som «ignorerte Egenskaper». Dette er egenskaper som for det meste ignoreres Av Realm, slik at de ikke blir lagret i db-filen, kan muteres utenfor skrivetransaksjoner, etc.Dette betyr imidlertid også at de ikke drar nytte av mange av egenskapene til ikke-ignorerte egenskaper, for eksempel spørringer. (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
Live resultater
Siste emne ved henting fra Realm-delen
Realm resultatsett returnerer alltid de nyeste oppdaterte dataene. Data I Resultatene er aldri utdatert. Dette betyr at du aldri trenger å laste resultater fra disk eller annen måte manuelt oppdatere in-memory data.
som vist i Figur 15 fikk vi den nye brukeren, og vi hentet ikke med realm.objects
metode i stedet nylig lagt til objekt presenteres på brukere variabel . Hvis Du kommer Fra Kjernedatabakgrunnen, må du igjen hente objekt fra stakken
Lesing og skriving kan skje på forskjellige steder i prosjektet, på forskjellige tråder, fra forskjellige prosesser, eller, når Du bruker Realm-Plattformen, fra hvor som helst i verden. Hver klasse i appen kan fokusere på forretningslogikken og glemme begrepet utdaterte eller bufrede data, siden Realm-objekter alltid er oppdaterte.
endre objekt på riket
som vist i figur 16 endrer vi primærnøkkelen og vi får»primærnøkkel kan ikke endres etter at et objekt er satt inn.»unntak siden vi ikke kan oppdatere primærnøkkelen . Primærnøkkelen legges til i Et Område, og primærnøkkelen kan ikke endres. Løsning → Fjern og sett inn objektet på nytt eller se dette spørsmålet i stackoverflow
som vist i figur 17 du kan ikke endre objekt hentet fra riket utenfor skrive transaksjonsblokk hvis du prøver å endre utenfor dette vil du få unntak «‘ forsøker å endre objekt utenfor en skrive transaksjon-call beginwritetransaction på en rlmrealm forekomst først.»
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
siste eksempel er veldig interessant vi utførte følgende oppgaver for å oppdatere bruker med newuser
- vi får brukeren med sin primærnøkkel
userId
som er 1 - opprettet ny
User
med samme primærnøkkel - på en skrivetransaksjon vi kaller legg til batch oppdater metode med oppdatering = sant det vil oppdatere Brukeren med primærnøkkel = 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 kobling til de slettede vil sette deres koblingsegenskap til null. Hvis disse objektene er koblet fra Noen Listeegenskaper, fjernes de fra de aktuelle listene.
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 realm objekt. Som vist i Figur realm.isEmpty
returnerer true