CRUD-Operation med RealmSwift Del 1

i den här delen kommer vi att täcka:

  1. Vad är Realm
  2. RealmSwift
  3. skapa en komplex Realm-Modell
  4. Varför använder vi @objc och dynamisk i egenskap
  5. till-en och till-många relation i Realm
  6. hur man lagrar Anpassad enum i Realm
  7. Vad är RealmOptional och hur man lagrar Swift valfri Atomegendom
  8. hur Beräknad egenskap fungerar som övergående egenskap i realm
  9. hur man gör indexering för prestationsförstärkning
  10. Vad är länkande objekt i Realm
  11. komplexa predikatfrågor
  12. crud operation
  13. vad är live resultat i Realm
  14. 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.

Figur 1

användarmodell

som visas i Figur 2 skapade vi användarmodell och lägger till några egenskaper:

  1. först ärver vi User klass från Object vilket gör det Realm 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å alla Object class Realm kan härleda ditt schema. Varje modell du vill fortsätta måste du ärva från Objektklass.
  2. firstName lagrar användarens förnamn som String. Eftersom RealmSwift ä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
  3. 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 vi userId primärnyckel genom att åsidosätta primarykey statisk funktion. Standardimplementeringen av denna metod returnerar noll. Obs userId fungerar som en objektiv c primitiv int-typ eftersom det är en omslag runt Objective C Realm
  4. 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ör Passport objektet kommer att lagra
  5. privateUserType är wrapper-egenskapen för UserType 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 som Int 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.
  6. 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 som RealmOptional 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.
  7. 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
  8. 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.
  9. slutligen gör vi userId och firstName som indexerade egenskaper. Genom att åsidosätta indexedProperties 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

figur 2

passmodell

som visas i Figur 3 skapade vi passmodell med de få egenskaperna

  1. passportNumber lagrar passinformationen och expiryDate 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
  2. Vi skapadepassport 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.

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

figur 5

som visas i Figur 6 utförde vi antal uppgifter

  1. vi får instansen av Realm databas
  2. skapad Passport och tre uppgifter som en todos
  3. skapad User objekt och tilldela pass och todos till det. Förutom denna initialiserade rike valfri egenskap som är isEmailSubscriptionEnable och Usertype 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

figur 6

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

  1. Vi har lagt till användare i ditt rike, och eftersom det refererar till pass och todos läggs dessa objekt också till riket.
  2. 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
  3. 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

figur 7

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

figur 8

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

figur 9

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.

Figur 10

hämta objekt från Realm

processen att hämta alla användarposter från Realm har följande uppgifter

  1. vi får instansen av Realm database och det kan kasta: en NSError om riket inte kunde initieras. Standard realm skapas när vi kallar init() utan parameter
  2. 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
  3. tryckt objekt på konsolen för att validera data finns och länka objekt som fungerar bra

figur 11

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.

Figur 12

som visas filtrerade vi med hjälp av något predikat här är listan över operatörer vi använde

  1. filter Portugals matchningar värden lika med
  2. filter Case okänsligacuspi matchningar värden lika med ignorera Case
  3. i {1,2,3} filter Portugals matchningar värde från en lista med värden.
  4. filter för filtermatchningar om värdet för förnamn börjar med A.
  5. filter bisexual matches if the firstName value conatins with li.
  6. predikat med Passobjekt vi vill filtrera användare som har passnummer == ’pass1’
  7. 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)

Figure 13

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

Figure 14

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.

figur 15

ä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

figur 16

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

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

sista exemplet är mycket intressant vi utförde följande uppgifter för att uppdatera användaren med Newuser

  1. vi får användaren med sin primära nyckel userId vilket är 1
  2. skapat nytt User med samma primära nyckel
  3. 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

Figure 20

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

Figure 22

Figure 23

As shown in Figure 24 we empty Realm database using deleteAll() method in realm objekt. Som visas i Figur realm.isEmpty returnerar true

figur 24

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/

Lämna ett svar

Din e-postadress kommer inte publiceras.