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
Userklasse fraObjectsom 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å alleObjectklasse Riket er i stand til å utlede skjemaet. Hver modell du vil fortsette, må du arve Fra Objektklasse. -
firstNamelagrer brukerens fornavn somString. SidenRealmSwifter 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 -
userIdlagrer 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 viuserIdprimærnøkkel ved å overstyreprimarykeystatisk funksjon. Standard implementering av denne metoden returnerer null. MerkuserIdfungerer Som En Objektiv c primitiv Int-type siden det er en wrapper rundt Objective C Realm -
passporteiendom 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 avPassportobjektet vil lagre -
privateUserTypeer wrapper eiendom avUserTypeSiden 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 somInti 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
isEmailSubscriptionEnablevi erklærer somRealmOptionalBool 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
-
isUserHasTodoser 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
userIdogfirstNamesom indekserte egenskaper. Ved å overstyreindexedPropertiesstatisk 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

figur 2
passmodell
som vist i figur 3 opprettet vi passmodell med de få egenskapene
-
passportNumberlagrer passinformasjonen ogexpiryDatelagrer utløpsdatoen for passet vi vil at disse egenskapene skal lagre derfor vi bruk@objcmeddynamicsøkeord for å fortelle realm gjøre din under panseret magi - vi opprettet
passporteiendom påUsermodell som betyrUserobjektet har sinpassportobjektreferanse 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 opprettetofUsereiendom I Passport som har en referanse til Alle brukerobjekter som tilordner Passobjekt i sinpassporteiendom. 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 .

figur 4
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 Realmved å 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
Realmdatabase - opprettet
Passportog tre oppgaver som entodos - Opprettet
Userobjekt og tilordne pass og todos til det. I tillegg til denne initialiserte Realm valgfrie egenskapen som erisEmailSubscriptionEnableogUsertypeenum 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 = 1er forsøkt å bli lagt til som et eget objekt Til Riket, vil et unntak utløses
figur 7
sjekk objekt fysisk lagre
ved å kjøre denne kommandoen på debugger utgang får du adressen til riket fil hvor dataene er lagret

figur 8
åpne
default.realmi 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.

div>
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.
figur 10
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
NSErrorhvis 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

figur 11
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.
Figur 12
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

Figur 18

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
userIdsom er 1 - opprettet ny
Usermed 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

figur 24
noen ganger må du bygge en slags hierarki mellom realm-objekter, akkurat som du er vant til å gjøre med swift-klasser. Dessverre Støtter Realm for øyeblikket ikke objektarv ut av boksen . omgåelse: 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/