i den här delen kommer vi att täcka:
- Vad är Realm
- RealmSwift
- skapa en komplex Realm-Modell
- Varför använder vi @objc och dynamisk i egenskap
- till-en och till-många relation i Realm
- hur man lagrar Anpassad enum i Realm
- Vad är RealmOptional och hur man lagrar Swift valfri Atomegendom
- hur Beräknad egenskap fungerar som övergående egenskap i realm
- hur man gör indexering för prestationsförstärkning
- Vad är länkande objekt i Realm
- komplexa predikatfrågor
- crud operation
- vad är live resultat i Realm
- saker undviks när Ändra Realm Objects
Realm är en plattformsoberoende mobil objektdatabas. Det är mycket snabb, performant och lätt att använda jämfört med kärndata och Sqlite. Den använder sin lagringsmekanism för att lagra objekt som JSON på disk jämfört med kärndata som använder Sqlite som backend. Det är skrivet i plattformsoberoende C++ så det fungerar exakt på samma sätt på Android, iOS, macOS eller någon annan plattform.
RealmSwift
det mesta av Realm är öppen källkod, men den hemliga såsen bakom Realms plattform är Core DB-motorn skriven från början i C++. RealmSwift är ett omslag runt Objective-C Realm framework och Objective-C Realm framework är ett omslag runt Realm Core DB engine.
komma igång
i den här handledningen kommer vi att arbeta med dessa modeller som visas i Figur 1
användar ~ ~ POS=TRUNC det är en modell innehåller användarinformation där userId
det är primärt. Det har också en till en relation med passmodell och till många relationer med Todo-uppgifter. (Användaren kan bara ha pass och har många todo-uppgifter)
Passportar det är en modell som innehåller passinformation för en användare och har också en omvänd länk till User
objekt.
todo Brasilian det är en modell som innehåller uppgifter för en användare och har också en omvänd länk till User
objekt.

användarmodell
som visas i Figur 2 skapade vi användarmodell och lägger till några egenskaper:
- först ärver vi
User
klass frånObject
vilket gör detRealm Object
. Realmobjekt är i grunden en standard datamodell, precis som alla andra standarddatamodeller som du har definierat i dina appar. Den enda skillnaden är att de stöds av Realm uthållighet och förmågor. Genom att titta på allaObject
class Realm kan härleda ditt schema. Varje modell du vill fortsätta måste du ärva från Objektklass. -
firstName
lagrar användarens förnamn somString
. EftersomRealmSwift
är ett omslag runt Objective-C Realm framework-typerna som String, Date och Data är underklasser av NSObject i Objective-C, så du kan också överväga dem objekttyper i Swift. Utöver detta betyder @objc att du vill ha din Swift-kod (klass, metod, egendom etc.) för att vara synlig från Objective-C medan dynamic innebär att du vill använda Objective-C dynamic dispatch. För att göra enkla swift objekt butiker i databasen rike använder Objective – C dynamisk dispatch funktion för att göra arbete under huven -
userId
lagrar användar-id som fungerar som en primärnyckel. Du kan ställa in en av objektets egenskaper som primärnyckel. Vanligtvis, egendom som unikt identifierar sig, det är en primär kandidat för en primärnyckel. Det hjälper dig en snabb sökning eller redigera objekt i en databas. Som visas i Figur 2 gör viuserId
primärnyckel genom att åsidosättaprimarykey
statisk funktion. Standardimplementeringen av denna metod returnerar noll. ObsuserId
fungerar som en objektiv c primitiv int-typ eftersom det är en omslag runt Objective C Realm -
passport
egenskapen lagrar användarpassinformationen som är ett annat Realm-objekt. Vi skapade en relation med Passmodellen. Till – en relation / objektlänk, där ett realmobjekt pekar på ett annat realmobjekt. När du skapar en relation med ett annat Realm-objekt måste dess egenskap vara av valfri typ. I passvariabelpekarreferens förPassport
objektet kommer att lagra -
privateUserType
är wrapper-egenskapen förUserType
eftersom UserType är swift enum kan vi inte lagra direkt på Realm. Alla dess ärendevärden skulle ha ett implicit tilldelat råvärde som matchar ärendets namn. Du använder detta raw-värde för att fortsätta enum-alternativen somInt
I Realm. Men klienten har tillgång till beräknad enum-egendom och under huven lagras enum raw-värde/atomvärde i databasen som inte är synlig för klienten. - sträng -, nsdate-och nsdata-egenskaper kan deklareras som valfria eller icke-valfria med hjälp av Standard Swift-syntaxen.Valfria numeriska typer deklareras med RealmOptional. Eftersom RealmSwift är omslag runt Objective C Realm och det finns ingen valfri Int i Objective C det är därför Realm skapade det är typ RealmOptional för detta scenarier. Alla mål C primitiv typ kräver i Swift med tillval måste du använda RealmOptional . Obs!: RealmOptional egenskaper kan inte deklareras som dynamiska och @objc sökord eftersom generiska egenskaper inte kan representeras i Objective C runtime, som används för dynamisk avsändning av dynamiska egenskaper, och bör alltid deklareras med let. Eftersom det är Realm-klass har det alla funktioner som Realm persistent object har. Som visas i Figur 2
isEmailSubscriptionEnable
vi deklarerar somRealmOptional
Bool betyder att det kan vara noll vi använde med let eftersom det är en referenstyp och vi vill inte att adressen ska ändras i framtiden. - som visas i Figur 2 kan användaren ha många todos som är en samling av Realm Todo-objekt . Lista som Realm-klass för att hålla samling av Realm-Objektinstanser. Vi skapade många relationer med todo-modellen. Till-många förhållanden, där ett rike objekt pekar på samling av Rike objekt. Om du använder normal Swift array för att lagra Realm-samling av objekt får du undantag. Obs: som RealmOptional listan kan inte deklareras som dynamisk och @objc sökord eftersom dess en Realm klass med alla inbyggda funktioner. Listan liknar mycket Array för inbyggda metoder och åtkomst till objekt med indexerad prenumeration. Listan som du ser skrivs och alla objekt ska vara av samma typ
-
isUserHasTodos
är en beräknad swift-egenskap och kommer inte att lagras i realm-databasen som returnerar om användaren har några uppgifter att göra eller inte. - slutligen gör vi
userId
ochfirstName
som indexerade egenskaper. Genom att åsidosättaindexedProperties
statisk metod tillhandahåller vi en rad egenskaper i strängform. Vi indexeras på Egenskaper för att förbättra åtkomsttiderna när du filtrerar eller frågar databasen

passmodell
som visas i Figur 3 skapade vi passmodell med de få egenskaperna
-
passportNumber
lagrar passinformationen ochexpiryDate
lagrar utgångsdatumet för passet vi vill att dessa egenskaper ska lagra det är därför vi använd@objc
meddynamic
nyckelord för att berätta rike gör din under huven Magi - Vi skapade
passport
egendom påUser
modell som betyderUser
objekt har sinapassport
objektreferens vad händer om vi vill ha passobjekt vet också vilken användare som har detta pass / har en hänvisning till användaren som är associerad med detta pass. Vi skapade bakåtlänkar med LinkingObjects vilket innebär att vi skapadeofUser
egendom i Passport som har en referens för alla användarobjekt som tilldelar Passport-objekt i desspassport
egendom. I kärndata kallas det som omvänd relation. Det är en dynamisk samling som berättar vem som länkar till det aktuella objektet.

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

vi gjort med modell / schema skapande och nu är det dags att göra faktiska CRUD operation
Lägg till objekt till Realm
vi först rensa några begrepp då vi kommer att kunna enkelt lägga till objekt i Realm
som visas i Figur 5 vi börjar med att få en instans av standard Realm
genom att initiera det utan några argument. Det enda sättet du kan komma åt databasen via realm-instans. EnRealm
instans (även kallad ”A Realm”) representerar en Realm-databas.Realms kan antingen lagras på disk (se init(path:)
) eller i minnet (se Configuration
) vi kommer att se i kommande delar. Realm
instanser är inte trådsäkra och kan inte delas över trådar eller sändningsköer. Du måste skapa en ny instans för varje tråd där en sfär kommer att nås.
som visas i Figur 5 eftersom det är en ny app och inget objekt lagrades i databasen realm.isEmpty
returnerar true betyder att databasen är tom som skrivs ut på konsolen

som visas i Figur 6 utförde vi antal uppgifter
- vi får instansen av
Realm
databas - skapad
Passport
och tre uppgifter som entodos
- skapad
User
objekt och tilldela pass och todos till det. Förutom denna initialiserade rike valfri egenskap som ärisEmailSubscriptionEnable
ochUsertype
enum med guldmedlemskap
som visas i Figur 6 realm databas fortfarande tom och omvänd relation/ länkning objekt fungerar inte heller för att vi inte har lagt till dessa objekt i riket. Realmobjekt (användare, Passport, Todo) kan instansieras och användas som ohanterade objekt (dvs. ännu inte lagt till en Realm) precis som vanliga Swift-objekt. För att göra dessa objekt som hanteras av Realm måste du lägga till dem i Realm

som visas i Figur 7 sätter vi äntligen in objekt i Realm-databasen. Vi utförde kaskad insats i DB.
Obs: alla ändringar i ett objekt (tillägg, modifiering och radering) måste göras inom en skrivtransaktion.Realm skrivoperationer är synkrona och blockerande, inte asynkrona. Om tråd a startar en skrivoperation, sedan tråd B startar en skrivoperation på samma område innan tråd A är klar, tråd A måste avsluta och begå sin transaktion innan tråd B: s skrivoperation äger rum. Skrivoperationer uppdateras alltid automatiskt så att inget tävlingsvillkor skapas. Skrivoperation kan kasta fel som att ta slut på diskutrymme
- Vi har lagt till användare i ditt rike, och eftersom det refererar till pass och todos läggs dessa objekt också till riket.
- genom att lägga till unmanaged object till realm gjorde vi dessa objekt hanterade nu som visas i konsolen fungerar våra bakåtlänkar. Nu kan passport också komma åt användarobjekt. Nu är vår databas inte mer Tom
- vi sätter slutligen in objekt i databasen eftersom vi sätter in objekt måste vi lägga till i skrivtransaktionsblocket och vi lägger till i riket genom att använda add-metoden på Realm-instansen. Om ett annat separat objekt med samma primära nyckel för användaren med
userId = 1
försöker läggas till som ett separat objekt i riket, kommer ett undantag att utlösas

kontrollera objekt fysiskt lagra
genom att köra detta kommando på debugger utgång får du adressen till Realm fil där dina data lagras

öppna
default.realm
I Realm studio
Realm Studio är vårt premiärutvecklarverktyg, byggt så att du enkelt kan hantera Realm-databasen och Realm-plattformen. Med Realm Studio kan du öppna och redigera lokala och synkroniserade riken, och administrera någon Realm Object Server instans. Ladda ner det nu för Mac, Windows eller Linux.

som visas i Figur 10 data som faktiskt lagras. Du kanske undrar Article
och Person
klass också där för att i en del av min projektklass skapa modeller Person och artikel. När programmet körs introspekterar Realm alla klasser i din app och ramar och hittar de klasser som underklass Realms Objektklass. Den anser att listan över dessa klasser är ditt dataschema som kommer att kvarstå på disk eller i minnet.

hämta objekt från Realm
processen att hämta alla användarposter från Realm har följande uppgifter
- vi får instansen av Realm database och det kan kasta: en
NSError
om riket inte kunde initieras. Standard realm skapas när vi kallarinit()
utan parameter - kallade objekt metod på Realm databas som kommer att returnera alla objekt av den givna typen som lagras i Realm Och det kommer att returnera ett resultat med alla objekt som visas i Figur 11
- tryckt objekt på konsolen för att validera data finns och länka objekt som fungerar bra

vi hämtade användaren spela in från sin primära nyckel som också är en indexerad egenskap så att vi får det valfria användarobjektet eftersom objekt med den här primära nyckeln kanske inte existerar. Primärnyckel kan vara Int
eller String
rekommendationen är att använda String.
det identifierar unikt specifika objekt i en Realm-databas.När ett primärnyckelvärde har ställts in på ett specifikt objekt kan det aldrig ändras.

som visas filtrerade vi med hjälp av något predikat här är listan över operatörer vi använde
- filter Portugals matchningar värden lika med
- filter Case okänsligacuspi matchningar värden lika med ignorera Case
- i {1,2,3} filter Portugals matchningar värde från en lista med värden.
- filter för filtermatchningar om värdet för förnamn börjar med A.
- filter bisexual matches if the firstName value conatins with li.
- predikat med Passobjekt vi vill filtrera användare som har passnummer == ’pass1’
- predikat med todos-objekt vi vill filtrera användare som har någon tdodo innehåller detaljer == ’behöver ot skapa RxSwift blog’
för avancerade frågor rekommenderas det starkt att sehttps://academy.realm.io/posts/nspredicate-cheatsheet/ detta nspredicate Cheatsheet
Obs: vad du hänvisar till som ”övergående (beräknade) egenskaper”, rike hänvisar till som ”ignorerade egenskaper”. Det här är egenskaper som För det mesta ignoreras av Realm, så de kommer inte att lagras i db-filen, kan muteras utanför skrivtransaktioner etc.Detta innebär dock också att de inte drar nytta av många av funktionerna i icke-ignorerade egenskaper, till exempel frågor. (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 resultat
senaste avsnittet vid hämtning från Realm-sektionen
Realm-resultatuppsättningar returnerar alltid de senaste aktuella uppgifterna. Data i resultat är aldrig föråldrade. Det betyder att du aldrig behöver ladda om resultat från disken eller på något sätt manuellt uppdatera data i minnet.
som visas i Figur 15 fick vi den nya användaren och vi hämtade inte med realm.objects
metod istället Nyligen tillagda objekt presenteras på användare variabel . Om du kommer från Core data background måste du återigen hämta objekt från stacken
läsning och skrivning kan hända på olika platser i projektet, på olika trådar, från olika processer eller, när du använder Realm-plattformen, var som helst i världen. Varje klass i appen kan fokusera på affärslogiken och glömma begreppet föråldrade eller cachade data, eftersom Realmobjekt alltid är uppdaterade.

ändra objekt på Rike
som visas i figur 16 ändrar vi primärnyckel och vi får ”primärnyckel kan inte ändras efter att ett objekt har infogats.”undantag eftersom vi inte kan uppdatera primärnyckel . Från Realm Docs primärnyckel läggs till i en Realm, primärnyckeln kan inte ändras. Lösning: ta bort och sätt tillbaka objektet eller se den här frågan i stackoverflow

som visas i figur 17 kan du inte ändra objekt som hämtats från Realm utanför skrivtransaktionsblocket om du försöker ändra utanför detta får du undantag ”” försöker ändra objekt utanför en skrivtransaktion — Ring beginwritetransaction 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


sista exemplet är mycket intressant vi utförde följande uppgifter för att uppdatera användaren med Newuser
- vi får användaren med sin primära nyckel
userId
vilket är 1 - skapat nytt
User
med samma primära nyckel - på en skrivtransaktion kallar vi Lägg till batch uppdateringsmetod med update = true det kommer att uppdatera användaren med primärnyckel = 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 att länka till de borttagna kommer att ställa in deras länkningsegenskap till noll. Om dessa objekt är länkade från någon Listegenskaper tas de bort från listorna i fråga.
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 visas i Figur realm.isEmpty
returnerar true

Ibland behöver du bygga någon form av hierarki mellan realmobjekt, precis som du är van vid att göra med Swift-klasser. Tyvärr stöder Realm för närvarande inte objektarv ur lådan . kringgå: 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/