CRUD Operasjon Ved Hjelp Av RealmSwift Del 1

i denne delen Vil Vi Dekke:Realmswift

  • Opprette En Kompleks Riket Modell
  • Hvorfor vi bruker @objc og dynamisk I Eiendom
  • Til-En Og Til-Mange Forhold I Riket
  • hvordan lagre Tilpasset enum I Riket
  • Hva er RealmOptional Og Hvordan Du Lagrer Swift Valgfritt Atomic Eiendom
  • Hvordan Beregnet Eiendom fungerer Som Forbigående Eiendom i riket
  • Hvordan gjøre indeksering for ytelse Gevinst
  • Hva Er Linking Objekt I Riket
  • Komplekse predikat Spørringer
  • crud operasjon
  • Hva er live resultater i riket
  • Ting Unngås Når Endre Realm Objects
  • 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.

    Figur 1

    brukermodell

    som vist i figur 2 opprettet vi brukermodell og legger til noen egenskaper:

    1. først arver vi User klasse fra Object som gjør det Realm 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å alle Object klasse Riket er i stand til å utlede skjemaet. Hver modell du vil fortsette, må du arve Fra Objektklasse.
    2. firstName lagrer brukerens fornavn som String. Siden RealmSwift 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
    3. 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 vi userId primærnøkkel ved å overstyre primarykey 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
    4. 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 av Passport objektet vil lagre
    5. 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 som Int 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.
    6. 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 2isEmailSubscriptionEnable 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.
    7. 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
    8. isUserHasTodos er en beregnet swift eiendom og vil ikke lagre i realm database som returnerer hvis brukeren har noen oppgaver å gjøre eller ikke.
    9. endelig gjør vi userId og firstName 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

    figur 2

    passmodell

    som vist i figur 3 opprettet vi passmodell med de få egenskapene

    1. passportNumber lagrer passinformasjonen og expiryDatelagrer utløpsdatoen for passet vi vil at disse egenskapene skal lagre derfor vi bruk @objc med dynamic søkeord for å fortelle realm gjøre din under panseret magi
    2. vi opprettet passport eiendom på User modell som betyr User objektet har sin passport 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 opprettet ofUser eiendom I Passport som har en referanse til Alle brukerobjekter som tilordner Passobjekt i sin passport eiendom. I Kjernedata kalles det som omvendt forhold. Det er en dynamisk samling som forteller deg hvem som lenker til gjeldende objekt.

    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 .

    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

    figur 5

    som vist i figur 6 utførte vi antall oppgaver

    1. vi får forekomsten av Realm database
    2. opprettet Passport og tre oppgaver som en todos
    3. OpprettetUser 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

    figur 6

    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

    1. vi har lagt Til Bruker i Riket ditt, Og siden det refererer til pass og todos, blir disse objektene også lagt til Riket.
    2. 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
    3. 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

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

    div>

    figur 9

    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

    1. vi får forekomsten av realm database og den kan kaste: en NSError hvis riket ikke kunne initialiseres. Standardområdet opprettes når vi kaller init() Uten parameter
    2. 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
    3. 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

    1. filter → matcher verdier lik
    2. filter små og små bokstaver matcher verdier lik ignorer små og store bokstaver
    3. i {1,2,3} filter → matcher verdi fra en liste over verdier.
    4. filter → matcher hvis fornavnverdien starter med a.
    5. filter → matcher hvis fornavnverdien conatins med li.
    6. Predikat Med Passobjekt vi vil filtrere Bruker Som har passnummer == ‘pass1’
    7. 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)

    Figure 13

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

    Figure 14

    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.

    figur 15

    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

    figur 16

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

    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

    Figur 18

    figur 19

    siste eksempel er veldig interessant vi utførte følgende oppgaver for å oppdatere bruker med newuser

    1. vi får brukeren med sin primærnøkkel userId som er 1
    2. opprettet ny User med samme primærnøkkel
    3. 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

    Figure 20

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

    Figure 22

    Figure 23

    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/

    Legg igjen en kommentar

    Din e-postadresse vil ikke bli publisert.