CRUD Operation Using RealmSwift Part 1

in this part, we will Cover:

  1. What is Realm
  2. Creating a Complex Realm Model
  3. Why we use @objc and dynamic in Property
  4. To-One and to-Many Relationship in Realm
  5. How to storage Custom enum in Realm
  6. What is RealmOptional and How to storage Swift Optional Atomic Property
  7. How Computed Property works as Transient Property in realm
  8. miten suoritusvoiton indeksointi tehdään
  9. mikä yhdistää objektin alueella
  10. kompleksiset predikaattikyselyt
  11. crud-operaatio
  12. mikä on live-tulos alueella
  13. asioita vältettiin, kun Modify Realm Objects

Realm on cross-platform mobile object database. Se on erittäin nopea, tehokas ja helppokäyttöinen verrattuna Ydintietoihin ja Sqlite. Se käyttää tallennusmekanismiaan tallentaakseen objektin jsonina levylle verrattuna Ydintietoihin, jotka käyttävät SQLiteä taustajärjestelmänään. Se on kirjoitettu cross-platform C++, joten se toimii täsmälleen samalla tavalla Android, iOS, macOS tai muulla alustalla.

RealmSwift

suurin osa Realmista on avointa lähdekoodia, mutta salainen kastike Realmsin Alustan takana on C++: lla tyhjästä kirjoitettu Core db-Moottori. RealmSwift on kääre ympäri Objective-C Realm framework ja Objective-C Realm framework on kääre ympäri Realm Core DB Moottori.

aloittaminen

tässä opetusohjelmassa työstämme näitä malleja kuten kuvassa 1

käyttäjä → se on malli, joka sisältää käyttäjätietoja, joissa userId se on ensisijainen. Sillä on myös To-one-suhde passimalliin ja to-Many-suhteet Todo-tehtäviin. (Käyttäjällä voi olla vain passi ja hänellä voi olla monia todo-tehtäviä)

passi → sen malli sisältää käyttäjän passitiedot ja siinä on myös käänteinen takalinkki User object.

Todo → sen malli sisältää käyttäjän tehtäviä ja siinä on myös User objekti.

Kuva 1

käyttäjämalli

kuvan 2 mukaisesti loimme käyttäjämallin ja lisäämme siihen muutamia ominaisuuksia:

  1. ensin perimme UserluokanObjectmikä tekee siitäRealm Object. Realm-objektit ovat periaatteessa standarditietomalli, aivan kuten mikä tahansa muu standarditietomalli, jonka olet määritellyt sovelluksissasi. Ainoa ero on, että heidän tukenaan on Realm sinnikkyys ja kyvyt. Tarkastelemalla kaikkia Object luokkamaailma pystyy päättelemään skeemansa. Jokainen malli, jonka haluat säilyttää, on perittävä Objektiluokalta.
  2. firstName tallentaa käyttäjän etunimen muodossa String. Koska RealmSwift on kääre Objective-C-alueen kehystyyppien kuten merkkijonon ympärillä, Date ja Data ovat Objective-C: n NSObject-alaluokkia, joten niitä voi tarkastella myös Swiftissä. Tämän lisäksi @objc tarkoittaa, että haluat Swift-koodisi (Luokka, menetelmä, ominaisuus jne.) olla näkyvissä Objective-C kun taas dynamic tarkoittaa haluat käyttää Objective-C dynamic dispatch. Yksinkertaisten Swift-objektien tallentaminen tietokantakehykseen käyttää Objective-C dynamic dispatch-ominaisuutta tehdäkseen työtä Hoodin alla
  3. userId tallentaa ensisijaisena avaimena toimivan käyttäjätunnuksen. Voit asettaa yhden kohteesi ominaisuuksista sen ensisijaiseksi avaimeksi. Yleensä ominaisuus, joka yksilöi itsensä, on ensisijainen ehdokas ensisijaiselle avaimelle. Se auttaa sinua nopeasti etsiä tai muokata objektin tietokantaan. Kuten kuviosta 2 käy ilmi, teemme userId ensisijaisen avaimen ohittamalla primarykey staattisen funktion. Tämän menetelmän oletustoteutus palaa nollaan. Huomautus userId toimii Objective C-primitiivisenä Int-tyyppinä, koska se on kääre Objective C-alueen ympärillä
  4. passport ominaisuus tallentaa käyttäjän passin tiedot, jotka ovat toisen alueen objekteja. Loimme yhden suhteen Passimalliin. To-one relationship / object link, jossa yksi realm-objekti osoittaa toiseen realm-objektiin. Kun luot suhteen toisen Realm-objektin kanssa, sen ominaisuuden on oltava valinnaista tyyppiä. Passion variable pointer reference of Passport object will store
  5. privateUserTypeon UserTypekoska UserType on swift enum, Emme voi tallentaa suoraan valtakuntaan. Kaikilla sen case-arvoilla olisi implisiittisesti annettu tapauksen nimeä vastaava raaka-arvo. Käytät tätä raaka-arvoa jatkaaksesi enum-valintojaInt in Realm. Mutta asiakas käyttää laskennallinen enum omaisuutta ja konepellin alla enum raaka-arvo / atomiarvo tallennetaan tietokantaan, joka ei näy asiakkaalle.

  6. String -, NSDate-ja NSData-ominaisuudet voidaan julistaa valinnaisiksi tai ei-valinnaisiksi Swift-standardin syntaksin avulla.Valinnaiset numeeriset tyypit ilmoitetaan käyttämällä RealmOptional-menetelmää. Koska Realmswift kääritään Objective C-alueen ympärille eikä Objective C: ssä ole valinnaista Int: tä, Realm loi tämän skenaarion tyypin realmoptional. Kaikki Tavoite C primitiivinen tyyppi vaativat Swift valinnainen sinun täytyy käyttää RealmOptional . Huomautus: Realmoptionaalisia ominaisuuksia ei voida julistaa dynaamisiksi ja @objc-avainsanoiksi, koska geneerisiä ominaisuuksia ei voida esittää objektiivisessa C-runtajassa, jota käytetään dynaamisten ominaisuuksien dynaamiseen lähettämiseen, ja ne tulee aina ilmoittaa let-merkinnällä. Koska se on Realm class sillä on kaikki ominaisuudet, jotka Realm continent object on. Kuten kuvassa 2 isEmailSubscriptionEnable ilmoitamme RealmOptional Bool tarkoittaa, että se voi olla nolla, jota käytimme let: n kanssa, koska sen a-viitetyyppi ja emme halua sen osoitteen muuttuvan tulevaisuudessa.
  7. kuten kuvassa 2 on esitetty, käyttäjällä voi olla monia todoja, jotka ovat kokoelma Realm Todo-olioita . Luetteloi Realm class-luokaksi, jolla pidetään kokoelma Realm-objekti-ilmentymiä. Loimme to-monelle suhteen Todo-malliin. To-many relation , jossa yksi realm objekti osoittaa kokoelma realm objekti. Jos käytät normaalia Swift array tallentaa Realm kokoelma objektin saat poikkeuksen. Huomautus: kuten RealmOptional List ei voida julistaa dynaaminen ja @objc avainsana, koska sen Realm luokan kaikki rakennettu ominaisuuksia. List on hyvin samanlainen Array rakennettu menetelmiä ja käyttää objekteja käyttäen indeksoitu subscripting. List as you see is typed and all objects should be of same type
  8. isUserHasTodos is computed swift property and will not storage in realm database which return if user have some tasks to do or not.
  9. lopuksi tehdään userId ja firstName indeksoituina ominaisuuksina. Ohittamalla indexedProperties staattinen menetelmä annamme joukon ominaisuuksia Merkkijonomuodossa. Indeksoimme ominaisuudet parantaaksemme pääsyä tietokantaa suodatettaessa tai tiedusteltaessa

kuva 2

passimalli

kuvan 3 mukaisesti loimme passimallin, jossa on muutamia ominaisuuksia

  1. passportNumber tallentaa passitiedot ja expiryDatetallentaa passin päättymispäivän haluamme nämä ominaisuudet tallentaa siksi me käytä @objc with dynamic keyword to tell realm do your under the hood magic
  2. loimme passport property on User model which means User object have their passport Object reference what if we want passport Object also know which user have this passport / have a reference to the user associated with this passport. Loimme käänteislinkit LinkingObjects-ohjelmalla, mikä tarkoittaa, että loimme ofUser property in Passport-ominaisuuden, jossa on viittaus kaikkiin Käyttäjäobjekteihin, jotka antavat Passport-objektin sen passport property. Ydinaineistossa sitä kutsutaan käänteiseksi suhteeksi. Sen dynaaminen kokoelma kertoo, kuka linkittää nykyiseen objektiin.

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 .

Kuva 4

we done with the model / schema creation and now it ’ s time to do actual crud Operation

add object to Realm

we first clear some concept then we will be able to easily add object in Realm

kuten kuvassa 5 on esitetty, we start by get an instance of the defaultRealmalustamalla sen ilman argumentteja. Ainoa tapa, jolla voit käyttää tietokantaa realm-instanssin kautta. Realm instanssi (myös” A Realm”) edustaa valtakunnan tietokantaa.Maailmat voidaan tallentaa joko levylle (KS. init(path:)) tai muistiin (KS. Configuration) näemme tulevissa osissa. Realm instanssit eivät ole kierreturvallisia, eikä niitä voi jakaa kierteille tai lähetysjonoille. Sinun täytyy luoda uusi instanssi jokaiselle säkeelle, jossa valtakuntaa käytetään.

kuten kuvassa 5, koska se on tuore sovellus eikä mitään objektia tallennettu tietokantaan realm.isEmpty palauttaa true means-tietokannan tyhjäksi konsolille tulostettuna

kuva 5

kuvan 6 mukaisesti suoritimme useita tehtäviä

  1. saammeRealmtietokanta
  2. luotu Passport ja kolme tehtävää todos
  3. Created User object and assignment passport and todos to it. Tämän alustetun alueen lisäksi valinnainen ominaisuus, joka on isEmailSubscriptionEnable ja Usertype enum kultajäsenyydellä

kuten kuvassa 6 valtakunnan tietokanta on edelleen tyhjä ja käänteinen suhde/ Linkitysobjekti ei myöskään toimi, koska emme lisänneet näitä objekteja valtakuntaan. Realm-objekteja (User,Passport,Todo)voidaan instantioida ja käyttää hallitsemattomina objekteina (joita ei ole vielä lisätty valtakuntaan) aivan kuten tavallisia Swift-objekteja. Jotta nämä objektit olisivat Realmin hallinnoimia, ne on lisättävä alueeseen

kuva 6

kuten kuvassa 7 esitetään, lisäämme objektin lopulta valtakunnan tietokantaan. Suoritimme CSS-insertin DB: hen.

HUOMAUTUS: Kaikki objektin muutokset (lisäys, muutos ja poisto) on tehtävä kirjoitustapahtuman sisällä.Valtakunnan kirjoitustoiminnot ovat synkronisia ja estäviä, eivät asynkronisia. Jos säie A aloittaa kirjoitusoperaation, säie B aloittaa kirjoitusoperaation samassa valtakunnassa ennen kuin säie A on valmis, säie A: n täytyy viimeistellä ja toimittaa liiketoimensa ennen säiettä B: n kirjoitusoperaatiota. Kirjoitustoiminnot päivittyvät aina automaattisesti, joten kisakuntoa ei synny. Kirjoitustoiminto voi heittää virheen, kuten levytilan loppumisen

  1. lisäsimme käyttäjän valtakuntaasi, ja koska se viittaa passiin ja todosiin, myös nämä objektit lisätään valtakuntaan.
  2. lisäämällä hallitsemattoman objektin realmiin saimme nämä objektit hallittua nyt, kuten konsolissa näytetään käänteislinkit toimivat. Nyt passport voi käyttää käyttäjäobjektin samoin. Nyt tietokantamme ei ole enää tyhjä
  3. lisäämme vihdoin objektin tietokantaan, koska lisäämme objektin, joka meidän on lisättävä write transaction-lohkoon ja lisäämme sen valtakuntaan käyttämällä add-menetelmää Realm instancessa. Nyt jos toinen erillinen objekti, jolla on sama käyttäjän ensisijainen avain userId = 1 , yritetään lisätä erilliseksi objektiksi valtakuntaan, aktivoituu poikkeus

kuva 7

tarkista objekti fyysisesti säilytä

suorittamalla tämä komento debuggeritulosteessa saat sen alueen tiedoston osoitteen, johon tietosi on tallennettu

Kuva 8

opendefault.realm in Realm studio
Realm Studio on meidän Premiere developer tool, rakennettu niin, että voit helposti hallita Realm-tietokantaa ja Realm-alustaa. Realm Studion avulla voit avata ja muokata paikallisia ja synkronoituja maailmoja sekä hallinnoida mitä tahansa Realm Object Server-instanssia. Lataa se nyt Macille, Windowsille tai Linuxille.

div>

kuva 9

kuten kuvassa 10 todellisuudessa tallennetut tiedot. Voi ihmetellä Article ja Person Luokka myös siellä, koska osassa projektiluokastani luodaan malleja persoona ja artikkeli. Kun sovellus suoritetaan, Realm tutkii kaikki sovelluksesi ja kehyksesi luokat ja löytää ne luokat, jotka alittavat Realmin Olioluokan. Se katsoo, että luettelo näistä luokista on tietosi skeema, joka säilyy levyllä tai muistissa.

Kuva 10

Hae objekti valtakunnasta

kaikkien käyttäjien tietueiden hakemisella valtakunnasta on seuraavat tehtävät

  1. saamme esiintymän alueen tietokannasta ja se voi heittää: NSErrorjos aluetta ei voitu alustaa. Oletusalue luodaan, kun kutsumme init() ilman parametria
  2. kutsutaan objektit-menetelmää valtakunnan tietokantaan, joka palauttaa kaikki valtakuntaan tallennetut objektit, ja se palauttaa tuloksen kaikkien objektien kanssa, kuten kuvassa 11
  3. tulostettu objekti konsolille, jotta voidaan vahvistaa tieto on olemassa ja linkittäminen objektit toimivat hyvin

kuva 11

haimme käyttäjän tallenna sen ensisijainen avain, joka on myös indeksoitu ominaisuus, joten saamme valinnainen käyttäjäobjektin, koska objekti tällä ensisijainen avain ei ehkä ole olemassa. Ensisijainen avain voi olla Int tai String suositus on käyttää String. se yksilöi tietyt kohteet valtakunnan tietokannassa.Kun ensisijainen avainarvo on asetettu tietylle objektille, sitä ei voi koskaan muuttaa.

Kuva 12

kuten osoitimme suodatimme käyttäen jotakin predikaattia tässä on luettelo operaattoreista, joita käytimme

  1. suodatin → vastaa arvoja, jotka ovat yhtä kuin
  2. suodatinkoko
  3. {1,2,3} suodatin → vastaa arvoa arvoluettelosta.
  4. suodatin → täsmää, jos etunimen arvo alkaa a: lla.
  5. suodatin → täsmää, jos etunimen arvo conatins li: n kanssa.
  6. predikaatti Passport-objektin kanssa haluamme suodattaa käyttäjän, jolla on passinumero = = ”pass1”
  7. predikaatti Todos-objektin kanssa haluamme suodattaa käyttäjän, jolla on jokin Tdodo sisältää yksityiskohtia = = ”Need ot create rxswift blog”

edistyneille kyselyille on erittäin suositeltavaa nähdä https://academy.realm.io/posts/nspredicate-cheatsheet/ this nspredicate Cheatsheet

note: what you refer to as ”transient (computed) Properties”, Realm refers to as ”ignorated Properties”. Nämä ovat ominaisuuksia, jotka ovat suurimmaksi osaksi huomiotta Realm, joten niitä ei tallenneta db tiedosto, voidaan mutatoida ulkopuolella kirjoittaa tapahtumia, jne.Tämä tarkoittaa kuitenkin myös sitä, että he eivät hyödy monista sivuuttamattomien ominaisuuksien ominaisuuksista, kuten kyselyistä. (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-tulokset

viimeinen aihe noudettaessa alueen osiosta

alueen tulosjoukot palauttavat aina uusimmat ajantasaiset tiedot. Tulokset eivät ole koskaan vanhentuneita. Tämä tarkoittaa, että sinun ei koskaan tarvitse ladata tuloksia levyltä tai jotenkin manuaalisesti päivittää muistitietoja.

kuten kuvassa 15 on esitetty, saimme uuden käyttäjän emmekä hakeneet käyttämällä realm.objects method sen sijaan uudet lisätyt objektit esitetään users-muuttujassa . Jos tulet Ydintietotaustasta, sinun täytyy hakea objekti uudelleen pinosta

lukeminen ja kirjoittaminen voi tapahtua projektin eri kohdissa, eri säikeillä, eri prosesseista tai, kun käytät Realm-alustaa, mistä tahansa päin maailmaa. Jokainen sovelluksen luokka voi keskittyä liiketoimintalogiikkaan ja unohtaa vanhentuneen tai välimuistiin tallennetun tiedon käsitteen, sillä Realm-objektit ovat aina ajan tasalla.

/div>

kuva 15

muokkaa objektia alueella

kuten kuvassa 16 on esitetty muutamme primaariavainta ja saamme ”primaariavainta ei voi muuttaa objektin lisäämisen jälkeen.”poikkeus, koska emme voi päivittää ensisijaista avainta . Kun alueen Docs ensisijainen avain lisätään alueeseen, ensisijaista avainta ei voi muuttaa. Workaround → Poista ja aseta kohde uudelleen tai katso tämä kysymys kohdasta stackoverflow

/div>

kuva 16

kuten kuvassa 17 on esitetty, et voi muuttaa objektia, joka on noudettu write transaction Blockin ulkopuolelta, jos yrität muuttaa tämän ulkopuolella saat poikkeuksen ”’yritetään muuttaa objektia kirjoitustapahtuman ulkopuolella — Call beginwritetransaction on an rlmrealm instance first.”

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

Kuva 18

kuva 19

viimeinen esimerkki on erittäin mielenkiintoinen suoritimme seuraavat tehtävät päivittääksemme käyttäjän uuden käyttäjän kanssa

  1. saamme käyttäjän ensisijaisella avaimellaanuserId joka on 1
  2. loi uudenUser samalla ensisijaisella avaimella
  3. kirjoitustapahtumassa, jota kutsumme lisäeräksi update method with update = true it will update the User having primary key = 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 linkittäminen poistettuihin asettaa niiden linkitysominaisuuden nollaan. Jos kohteet on linkitetty johonkin Listaominaisuuteen, ne poistetaan kyseisistä listoista.

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 object. Kuten kuvassa realm.isEmpty palauttaa true

kuva 24

joskus täytyy rakentaa jonkinlainen hierarkia valtakunnan olioiden välille, aivan kuten swift-luokilla on totuttu tekemään. Valitettavasti Realm ei tällä hetkellä tue objektien perintöä kättelyssä . kiertotapa: 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/

Vastaa

Sähköpostiosoitettasi ei julkaista.