i denne del dækker vi:
- hvad er Realm
- oprettelse af en kompleks Realm Model
- hvorfor vi bruger @objc og dynamisk i ejendom
- til-en og til-mange forhold i Realm
- Sådan gemmes brugerdefineret enum i Realm
- hvad er RealmOptional og hvordan man gemmer hurtig valgfri atomisk ejendom
- hvordan beregnet ejendom fungerer som forbigående ejendom i realm
- sådan gør indeksering for ydeevne gevinst
- hvad er linking objekt i realm
- komplekse prædikat forespørgsler
- crud operation
- hvad er live resultater i realm
- 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
- 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
- brugermodel
- pasmodel
- Tilføj objekt til rige
- kontroller objekt fysisk butik
- Hent objekt fra realm
- Live resultater
- Rediger Objekt på Realm
- Delete Object From Realm
- Useful Links
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.

brugermodel
som vist i figur 2 oprettede vi brugermodel og tilføjer et par egenskaber:
- først arver vi
User
klasse fraObject
hvilket gør detRealm 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 alleObject
klasse Rige er i stand til at udlede dit skema. Hver model, du vil fortsætte, skal du arve fra objektklasse. -
firstName
gemmer brugerens fornavn somString
. DaRealmSwift
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 -
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 viuserId
primær nøgle ved at tilsidesætteprimarykey
statisk funktion. Standardimplementeringen af denne metode returnerer nul. BemærkuserId
fungerer som en objektiv C primitiv int-type, da det er en indpakning omkring Objective C Realm -
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 afPassport
objekt vil gemme -
privateUserType
er indpakningsegenskaben forUserType
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 somInt
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 2isEmailSubscriptionEnable
Vi erklærer somRealmOptional
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. - 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
-
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. - endelig laver vi
userId
ogfirstName
som indekserede egenskaber. Ved at tilsidesætteindexedProperties
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
pasmodel
som vist i figur 3 oprettede vi pasmodel med de få egenskaber
-
passportNumber
gemmer pasoplysningerne ogexpiryDate
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 - vi oprettede
passport
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 oprettedeofUser
ejendom i Pas, der har en reference til alle brugerobjekter, der tildeler Pasobjekt i detspassport
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.

As shown in Figure 4 we created Todo
Realm model with has a backlink to the all the users pointing to particular task .

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

som vist i figur 6 udførte vi antal opgaver
- Vi får forekomsten af
Realm
database - oprettet
Passport
og tre opgaver som entodos
- oprettet
User
objekt og tildele pas og todos til det. Ud over denne initialiserede Realm valgfri egenskab, som erisEmailSubscriptionEnable
ogUsertype
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

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
- Vi tilføjede bruger til dit rige, og da det refererer til pas og todos, tilføjes disse objekter også til riget.
- 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
- 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
kontroller objekt fysisk butik
Ved at køre denne kommando på debuggeroutput får du adressen til realm-filen, hvor dine data er gemt

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

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.

Hent objekt fra realm
processen med at hente alle brugeroptegnelser fra realm har følgende opgaver
- vi får forekomsten af realm database, og den kan kaste: en
NSError
hvis realm ikke kunne initialiseres. Standard realm oprettes, når vi kalderinit()
uden parameter - 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
- trykt objekt på konsollen for at validere data er der og forbinder objekter, der fungerer fint

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 Int
ellerString
anbefalingen 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.

som vist filtrerede vi ved hjælp af et eller andet prædikat her er listen over operatører, vi brugte
- filter, der matcher værdier svarende til
- filter, der er ufølsom, og som er lig med Ignorer sag
- i {1,2,3} filter, der matcher værdien for at matche værdier fra en liste over værdier.
- filtrer larp-matches, hvis fornavnsværdien starter med a.
- filterkampe, hvis fornavnsværdien conatins med li.
- predikat med Pasobjekt vi vil filtrere bruger, der har pasnummer == ‘pass1’
- 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)

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

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.

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

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

sidste eksempel er meget interessant, vi udførte følgende opgaver for at opdatere brugeren med den nyebruger
- Vi får brugeren med sin primære nøgle
userId
hvilket er 1 - oprettet nyt
User
med den samme primære nøgle - 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


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’


As shown in Figure 24 we empty Realm database using deleteAll()
method in realm objekt. Som vist i figur realm.isEmpty
returnerer true

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/