CRUD Operation ved hjælp af Realmsvej Del 1

i denne del dækker vi:

  1. hvad er Realm
  2. oprettelse af en kompleks Realm Model
  3. hvorfor vi bruger @objc og dynamisk i ejendom
  4. til-en og til-mange forhold i Realm
  5. Sådan gemmes brugerdefineret enum i Realm
  6. hvad er RealmOptional og hvordan man gemmer hurtig valgfri atomisk ejendom
  7. hvordan beregnet ejendom fungerer som forbigående ejendom i realm
  8. sådan gør indeksering for ydeevne gevinst
  9. hvad er linking objekt i realm
  10. komplekse prædikat forespørgsler
  11. crud operation
  12. hvad er live resultater i realm
  13. Ting undgås, når Rediger Realm objekter

Realm er en cross-platform mobil objekt database. Det er meget hurtigt, effektivt og nemt at bruge i forhold til kernedata. Det bruger sin lagringsmekanisme til at gemme objekt som JSON på disken sammenlignet med kernedata, der bruger som backend. Det er skrevet i C++ på tværs af platforme, så det fungerer nøjagtigt på samme måde på Android, iOS, macOS eller enhver anden platform.

det meste af Realm er open source, men den hemmelige sauce bag Realms platform er kernen DB motor skrevet fra bunden i C++. Realm er en indpakning omkring Objective-C Realm-rammen, og Objective-C Realm-rammen er en indpakning omkring Realm Core DB-motor.

Kom godt i gang

i denne tutorial vil vi arbejde på disse modeller, som vist i Figur 1

user Price det er en model indeholder brugeroplysninger, hvor userId det er primært. Det har også en til-en forhold til pas model og til-mange relationer med Todo Opgaver. (Bruger kan kun have pas og har mange todo-Opgaver)

Passportkrus det er en model, der indeholder pasoplysninger fra en bruger og har også et omvendt link til User objekt.

Todo Kurt det er en model, der indeholder en brugers opgaver og har også et omvendt link tilUser objekt.

Figur 1

brugermodel

som vist i figur 2 oprettede vi brugermodel og tilføjer et par egenskaber:

  1. først arver vi User klasse fra Object hvilket gør det Realm Object. Realm-objekter er dybest set en standarddatamodel, ligesom enhver anden standarddatamodel, du har defineret i dine apps. Den eneste forskel er, at de er bakket op af Realm Persistens og evner. Ved at undersøge alle Object klasse Rige er i stand til at udlede dit skema. Hver model, du vil fortsætte, skal du arve fra objektklasse.
  2. firstNamegemmer brugerens fornavn somString. Da RealmSwift er en indpakning omkring Objective-C Realm rammetyper som streng, dato og Data er underklasser af NSObject i Objective-C, så du kan også overveje dem objekttyper hurtigt. Ud over dette @objc betyder, at du vil have din hurtige kode (klasse, metode, ejendom osv.) at være synlig fra Objective-C, mens dynamic betyder, at du vil bruge Objective-C dynamic dispatch. For at lave enkle hurtige objektbutikker i databaseområdet bruger Objective-C dynamic dispatch-funktion til at udføre arbejde under hætten
  3. userId gemmer bruger-id ‘ et, der fungerer som en primær nøgle. Du kan indstille et af objektets egenskaber som dets primære nøgle. Som regel, ejendom, der entydigt identificerer sig selv, der er en primær kandidat til en primær nøgle. Det hjælper dig en hurtig opslag eller redigere objekt i en database. Som vist i figur 2 laver vi userId primær nøgle ved at tilsidesætte primarykey statisk funktion. Standardimplementeringen af denne metode returnerer nul. Bemærk userId fungerer som en objektiv C primitiv int-type, da det er en indpakning omkring Objective C Realm
  4. passport ejendom gemmer brugerens pasoplysninger, som er et andet Realm-objekt. Vi skabte to-One forhold til pasmodellen. To-one relationship / object link , hvor et realm objekt peger på et andet realm objekt. Når du opretter en relation til et andet Realm-objekt, skal dets egenskab være af en valgfri type. I Pas variabel pointer reference af Passport objekt vil gemme
  5. privateUserTypeer indpakningsegenskaben for UserType da UserType er hurtig enum, kan vi ikke gemme direkte på Realm. Alle dens sagsværdier ville have en implicit tildelt rå værdi, der matcher sagens navn. Du bruger denne rå værdi til at fortsætte enum-indstillingerne som Int i Realm. Men klienten har adgang til beregnet enum-ejendom, og under hætten lagrer enum rå værdi/atomværdi i databasen, som ikke er synlig for klienten.egenskaber for streng, Nsdate og NSData kan erklæres som valgfri eller ikke-valgfri ved hjælp af standard hurtig syntaks.Valgfrie numeriske typer erklæres ved hjælp af RealmOptional. Da Realm er indpakning omkring Objective C Realm, og der ikke er nogen valgfri Int i Objective C, er det derfor, at Realm skabte det Type RealmOptional for disse scenarier. Al den objektive C primitive type kræver hurtig med valgfri, du skal bruge RealmOptional . Bemærk: RealmOptional egenskaber kan ikke deklareres som dynamisk og @objc søgeord, fordi generiske egenskaber ikke kan repræsenteres i Objective C runtime, som bruges til dynamisk afsendelse af dynamiske egenskaber, og bør altid deklareres med let. Da det er Realm class, har det alle funktioner, som Realm persistent object har. Som vist i figur 2 isEmailSubscriptionEnable Vi erklærer som RealmOptional Bool betyder, at det kan være nul, vi brugte med let, da det er en referencetype, og vi ønsker ikke, at adressen skal ændres i fremtiden.
  6. som vist i figur 2 Bruger kan have mange todos, som er en samling af Realm Todo objekter . Liste som Realm klasse til at holde samling af Realm objekt forekomster. Vi skabte to-mange forhold til Todo-modellen. Til-mange forhold, hvor et rige objekt peger på samling af rige objekt. Hvis du bruger normal hurtig array til at gemme Realm samling af objekt vil du få undtagelse. Bemærk: ligesom RealmOptional liste kan ikke erklæres som dynamisk og @objc søgeord, da det er en Realm klasse med alle de indbyggede funktioner. Liste ligner meget Array for indbyggede metoder og adgang til objekter ved hjælp af indekseret abonnement. Liste som du ser er skrevet, og alle objekter skal være af samme type
  7. isUserHasTodos er en beregnet hurtig egenskab og vil ikke gemme i realm database, som vender tilbage, hvis brugeren har nogle opgaver at gøre eller ej.
  8. endelig laver vi userIdog firstName som indekserede egenskaber. Ved at tilsidesætte indexedProperties statisk metode leverer vi en række egenskaber i strengform. Vi indekserer ejendomme for at forbedre adgangstiderne, når vi filtrerer eller forespørger databasen

figur 2

pasmodel

som vist i figur 3 oprettede vi pasmodel med de få egenskaber

  1. passportNumber gemmer pasoplysningerne og expiryDate gemmer udløbsdatoen for det pas, vi ønsker, at disse ejendomme skal gemme det er derfor, vi brug@objc meddynamic nøgleord for at fortælle realm gør din under hætten magi
  2. vi oprettedepassport ejendom påUser model hvilket betyderUser objekt har derespassport objektreference hvad hvis vi ønsker pasobjekt ved også, hvilken bruger der har dette pas / har en henvisning til brugeren, der er knyttet til dette pas. Vi oprettede backlinks ved hjælp af LinkingObjects, hvilket betyder, at vi oprettede ofUser ejendom i Pas, der har en reference til alle brugerobjekter, der tildeler Pasobjekt i dets passport ejendom. I kernedata kaldte det det som omvendt forhold. Det er en dynamisk samling, der fortæller dig, hvem der linker til det aktuelle 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 er færdige med oprettelsen af model/skema, og nu er det tid til at udføre den faktiske CRUD-operation

Tilføj objekt til rige

vi rydder først noget koncept, så vil vi let kunne tilføje objekt i rige

som vist i figur 5 starter vi med at få en forekomst af standard Realm ved at initialisere det uden nogen argumenter. Den eneste måde du kan få adgang til database gennem realm instans. EnRealm forekomst (også kaldet “et rige”) repræsenterer en Realm-database.Realms kan enten gemmes på disken (se init(path:)) eller i hukommelsen (se Configuration) vi vil se i kommende dele. Realm forekomster er ikke trådsikre og kan ikke deles på tværs af tråde eller afsendelseskøer. Du skal konstruere en ny forekomst for hver tråd, hvor der er adgang til et rige.

som vist i figur 5, da det er en frisk app, og der ikke blev gemt noget objekt i databasen realm.isEmpty returnerer sandt betyder, at databasen er tom som trykt på konsollen

figur 5

som vist i figur 6 udførte vi antal opgaver

  1. Vi får forekomsten af Realm database
  2. oprettet Passport og tre opgaver som en todos
  3. oprettet User objekt og tildele pas og todos til det. Ud over denne initialiserede Realm valgfri egenskab, som er isEmailSubscriptionEnable og Usertype enum med guldmedlemskab

som vist i figur 6 realm database stadig tom og omvendt forhold/ Sammenkædningsobjekt fungerer heller ikke, fordi vi ikke tilføjede disse objekter til riget. Realm objekter (bruger,pas,Todo)kan instantieres og bruges som ikke-administrerede objekter (dvs.endnu ikke tilføjet til et Rige) ligesom almindelige hurtige objekter. For at lave disse objekter, der administreres af Realm, skal du tilføje dem i Realm

figur 6

som vist i figur 7 indsætter vi endelig objekt i realm database. Vi udførte cascading indsats i DB.

Bemærk: alle ændringer til et objekt (tilføjelse, ændring og sletning) skal ske inden for en skrivetransaktion.Realm skrive operationer er synkron og blokering, ikke asynkron. Hvis tråd a starter en skriveoperation, starter tråd B en skriveoperation på samme område, før tråd A er færdig, tråd A skal afslutte og begå sin transaktion, før tråd B ‘ s skriveoperation finder sted. Skriveoperationer opdateres altid automatisk, så der ikke oprettes nogen race-tilstand. Skriv operation kan kaste fejl som at løbe tør for diskplads

  1. Vi tilføjede bruger til dit rige, og da det refererer til pas og todos, tilføjes disse objekter også til riget.
  2. ved at tilføje ikke-administreret objekt til realm gjorde vi disse objekter administreret nu som vist i konsollen vores backlinks fungerer. Nu Kan pas også få adgang til Brugerobjekt. Nu er vores database ikke mere Tom
  3. vi indsætter endelig objekt i databasen, da vi indsætter objekt, vi skal tilføje i skrivetransaktionsblokken, og vi tilføjer i riget ved hjælp af Tilføj metode på rige instans. Nu, hvis et andet separat objekt med den samme primære nøgle til bruger med userId = 1 forsøges tilføjet som et separat objekt til riget, udløses en undtagelse

figur 7

kontroller objekt fysisk butik

Ved at køre denne kommando på debuggeroutput får du adressen til realm-filen, hvor dine data er gemt

figur 8

opendefault.realm i realm Studio
realm Studio er vores premiere udvikler værktøj, bygget, så du nemt kan styre realm database og realm platform. Med Realm Studio kan du åbne og redigere lokale og synkroniserede riger og administrere enhver Realm Object Server-forekomst. Hent det nu til Mac.

figur 9

som vist i figur 10 data faktisk gemt. Du undrer dig måske Article og Person klasse også der, fordi i nogle af mine projektklasser opretter modeller Person og artikel. Når programmet kører, Realm introspects alle klasserne i din app og rammer og finder de klasser, der underklasse Realm objekt klasse. Den anser listen over disse klasser for at være dit dataskema, der vil blive vedvarende på disken eller i hukommelsen.

Figur 10

Hent objekt fra realm

processen med at hente alle brugeroptegnelser fra realm har følgende opgaver

  1. vi får forekomsten af realm database, og den kan kaste: en NSError hvis realm ikke kunne initialiseres. Standard realm oprettes, når vi kalder init() uden parameter
  2. kaldet objekter metode på Realm database, som vil returnere alle objekter af den givne type, der er gemt i Realm, og det vil returnere et resultat med alle objekterne som vist i Figur 11
  3. trykt objekt på konsollen for at validere data er der og forbinder objekter, der fungerer fint

figur 11

vi hentede bruger Optag fra sin primære nøgle, som også er en indekseret egenskab, så vi får det valgfrie Brugerobjekt, da objekt med denne primære nøgle muligvis ikke eksisterer. Primær nøgle kan være IntellerStringanbefalingen er at brugeString. det identificerer entydigt specifikke objekter i en Realm-database.Når en primær nøgleværdi er indstillet på et bestemt objekt, kan den aldrig ændres.

Figur 12

som vist filtrerede vi ved hjælp af et eller andet prædikat her er listen over operatører, vi brugte

  1. filter, der matcher værdier svarende til
  2. filter, der er ufølsom, og som er lig med Ignorer sag
  3. i {1,2,3} filter, der matcher værdien for at matche værdier fra en liste over værdier.
  4. filtrer larp-matches, hvis fornavnsværdien starter med a.
  5. filterkampe, hvis fornavnsværdien conatins med li.
  6. predikat med Pasobjekt vi vil filtrere bruger, der har pasnummer == ‘pass1’
  7. predikat med Todos-objekt vi vil filtrere bruger, der har nogen tdodo indeholder detaljer == ‘brug for at oprette en blog’

for avancerede forespørgsler anbefales det stærkt at sehttps://academy.realm.io/posts/nspredicate-cheatsheet/ dette nspredicate Cheatsheet

bemærk: hvad du refererer til som “forbigående (beregnede) egenskaber”, Realm refererer til som “ignorerede egenskaber”. Dette er egenskaber, der for det meste ignoreres af Realm, så de ikke gemmes i db-filen, kan muteres uden for skrivetransaktioner osv.Dette betyder dog også, at de ikke drager fordel af mange af funktionerne i ikke-ignorerede egenskaber, såsom forespørgsler. (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

sidste emne om hentning fra Realm sektion

Realm resultatsæt returnerer altid de seneste opdaterede data. Data i resultater er aldrig forældet. Dette betyder, at du aldrig behøver at genindlæse resultater fra disken eller på en eller anden måde manuelt opdatere data i hukommelsen.

som vist i Figur 15 fik vi den nye bruger, og vi hentede ikke ved hjælp af realm.objects metode i stedet nyligt tilføjet objekt præsenteres på brugernes variabel . Hvis du kommer fra Kernedatabaggrund, skal du igen hente objekt fra stakken

læsning og skrivning kan ske på forskellige steder i projektet, på forskellige tråde, fra forskellige processer eller, når du bruger Realm-platformen, hvor som helst i verden. Hver klasse i appen kan fokusere på forretningslogikken og glemme forestillingen om forældede eller cachelagrede data, da Realm-objekter altid er opdaterede.

figur 15

Rediger Objekt på Realm

som vist i figur 16 ændrer vi primær nøgle, og vi får “primær nøgle kan ikke ændres, når et objekt er indsat.”undtagelse, da vi ikke kan opdatere primær nøgle . Fra Realm Docs primære nøgle føjes til en Realm, kan den primære nøgle ikke ændres. Løsning for at fjerne og genindsætte objektet eller se dette spørgsmål i stackoverløb

figur 16

som vist i figur 17 kan du ikke ændre objekt hentet fra rige uden for skrivetransaktionsblokken, hvis du forsøger at ændre uden for dette, får du undtagelse”‘forsøg på at ændre objekt uden for en skrivetransaktion — ring begynderskrifttransaktion på en rlmrealm-instans 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

sidste eksempel er meget interessant, vi udførte følgende opgaver for at opdatere brugeren med den nyebruger

  1. Vi får brugeren med sin primære nøgle userId hvilket er 1
  2. oprettet nyt User med den samme primære nøgle
  3. på en skrivetransaktion kalder vi Tilføj batch Opdater metode med opdatering = true det vil opdatere brugeren med primær nøgle = 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 sammenkædning til de slettede dem vil sætte deres sammenkædning ejendom til nul. Hvis disse objekter er sammenkædet fra en liste egenskaber, de er fjernet fra de pågældende lister.

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

nogle gange er du nødt til at opbygge en slags hierarki mellem realm objekter, ligesom du er vant til at gøre med hurtige klasser. Desværre understøtter Realm i øjeblikket ikke objektarv ud af kassen . 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/

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.