CRUD művelet a RealmSwift 1. részével

ebben a részben a következőket fogjuk fedezni:

  1. mi a Birodalom
  2. RealmSwift
  3. komplex birodalmi modell létrehozása
  4. miért használjuk a @objc-t és a dinamikát a tulajdonban
  5. To-One and To-Many kapcsolat a birodalomban
  6. hogyan tárolhatjuk az egyéni enumot a birodalomban
  7. mi a RealmOptional és hogyan tárolhatjuk a Swift opcionális atomi tulajdonságát
  8. hogyan működik a számított tulajdonság Átmeneti tulajdonságként a birodalomban
  9. hogyan kell csinálni indexelés teljesítmény nyereség
  10. mi összekötő objektum birodalomban
  11. komplex predikátum lekérdezések
  12. crud művelet
  13. mi az élő eredmények birodalomban
  14. a dolgok kerülni, ha Realm objektumok módosítása

Realm egy cross-platform mobil objektum adatbázis. Ez nagyon gyors, hatékony és könnyen használható, mint a Core Data és Sqlite. Ez használ a tárolási mechanizmus tárolására objektum JSON lemezen, mint az alapadatok használó Sqlite, mint a backend. Többplatformos C++ nyelven íródott, így pontosan ugyanúgy működik Androidon, iOS-en, macOS-on vagy bármely más platformon.

RealmSwift

a legtöbb Realm nyílt forráskódú, de a titkos szósz mögött Realm platform a Core DB MOTOR írt a semmiből A C++. A RealmSwift egy burkoló az Objective-C birodalmi keretrendszer körül, az Objective-C birodalmi keretrendszer pedig a Realm Core DB MOTOR körül.

első lépések

ebben az oktatóanyagban az 1.ábrán látható módon fogunk dolgozni ezeken a modelleken

user ons ez egy olyan modell, amely felhasználói információkat tartalmaz, amelyekben userId elsődleges. Ez is egy-egy kapcsolat útlevél modell és-sok kapcsolat Todo feladatokat. (A felhasználónak csak passportja lehet, és sok todo feladata van)

Passport! ez egy modell, amely tartalmazza a felhasználó útlevél adatait, és rendelkezik egy User objektum fordított linkjével is.

todo Enterprises ez egy modell tartalmaz feladatokat a felhasználó, és van egy fordított vissza linkUser objektum.

.ábra

felhasználói modell

a 2. ábrán látható módon létrehoztuk a felhasználói modellt, és hozzáadunk néhány tulajdonságot:

  1. először örököljük User osztályt a Object ami miatt Realm Object. A birodalmi objektumok alapvetően egy szabványos adatmodell, hasonlóan bármely más szabványos adatmodellhez, amelyet az alkalmazásokban definiált. Az egyetlen különbség az, hogy a Birodalom kitartása és képességei támogatják őket. Ha megnézzük az összes Object class Realm képesek következtetni a séma. Minden modell azt szeretné, hogy továbbra is fennállnak meg kell örökölni objektum osztály.
  2. firstNamea felhasználó keresztnevét String néven tárolja. Mivel a RealmSwift az Objective-C tartomány keretrendszer típusainak, mint a String, a Date és a Data az Nsobject alosztályai az Objective-C-ben, így a Swiftben is tekinthetjük őket objektum típusoknak. Ezen kívül @objc azt jelenti, hogy a Swift-kódot szeretné (osztály, módszer, tulajdonság stb.) az Objective-C-ből látható, míg a dinamikus azt jelenti, hogy az Objective-C dinamikus küldést szeretné használni. Ahhoz, hogy egyszerű swift objektum tárolja adatbázis birodalmában használ Objective-C dinamikus dispatch funkció, hogy nem működik a motorháztető alatt
  3. userId tárolja a felhasználói azonosító, amely működik, mint egy elsődleges kulcs. Beállíthatja az objektum egyik tulajdonságát elsődleges kulcsként. Általában olyan tulajdonság, amely egyedileg azonosítja magát, ez az elsődleges kulcs elsődleges jelöltje. Ez segít egy gyors keresést vagy szerkeszteni objektumot egy adatbázisban. Amint a 2. ábrán látható, a userId elsődleges kulcsot a primarykey statikus funkció felülbírálásával hozzuk létre. Ennek a módszernek az alapértelmezett megvalósítása nulla értéket ad vissza. Megjegyzés: userId Objective C primitív Int típusként működik, mivel az Objective C tartomány köré burkoló
  4. passport tulajdonság tárolja a felhasználói útlevél adatait, amely egy másik Tartományobjektum. Létrehoztunk egy kapcsolatot az útlevél modellel. To-one relationship / object link , amelyben az egyik birodalmi objektum egy másik birodalmi objektumra mutat. Amikor kapcsolatot hoz létre egy másik birodalmi objektummal, annak tulajdonságának opcionális típusúnak kell lennie. A passport változó mutató hivatkozása Passport objektum tárolja
  5. privateUserType a wrapper tulajdonsága UserType mivel UserType swift enum nem tudjuk tárolni közvetlenül Realm. Minden esetértékének implicit módon hozzárendelt nyers értéke lenne, amely megfelel az eset nevének. Ezt a nyers értéket fogja használni, hogy az enum opciókat Int néven tartsa fenn a birodalomban. De az ügyfél hozzáfér a számított enum tulajdonsághoz, és a motorháztető alatt az enum nyers érték / atomi érték olyan adatbázisban tárolódik, amely nem látható az ügyfél számára.a
  6. String, NSDate és NSData tulajdonságok megadhatók opcionálisnak vagy nem opcionálisnak a standard Swift szintaxis használatával.Az opcionális numerikus típusokat a RealmOptional használatával deklaráljuk. Mivel a RealmSwift az Objective C Birodalom köré van csomagolva, és nincs opcionális Int az Objective C-ben, ezért a Realm létrehozta a realmoptional típusát ehhez a forgatókönyvhöz. Az összes Objective C primitív típus megköveteli a Swift-ben, opcionálisan a RealmOptional-t kell használnia . Megjegyzés: a RealmOptional tulajdonságok nem deklarálhatók dinamikus és @ objc kulcsszóként, mert az Általános tulajdonságok nem ábrázolhatók az Objective C futásidejében, amelyet a dinamikus tulajdonságok dinamikus feladására használnak, és mindig a let-rel kell deklarálni. Mivel ez a Realm osztály, minden olyan tulajdonsággal rendelkezik, amely a Realm persist object-nek van. Amint azt a 2. ábra mutatja isEmailSubscriptionEnable deklaráljuk RealmOptional A Bool azt jelenti, hogy nulla lehet, mivel referenciatípusa van, és nem akarjuk, hogy a címe a jövőben megváltozzon.
  7. amint az a 2. ábrán látható, a felhasználónak sok todos lehet, amely a Realm Todo objektumok gyűjteménye . Sorolja fel birodalmi osztályként a Birodalom objektum példányainak gyűjteményét. Sok kapcsolatot hoztunk létre a Todo modellel. To-Sok kapcsolat, amelyben egy birodalmi objektum a birodalmi objektum gyűjteményére mutat. Ha normál Swift tömböt használ az objektum birodalmi gyűjteményének tárolására, kivételt kap. Megjegyzés: a Like RealmOptional List nem deklarálható dinamikus és @ objc kulcsszóként, mivel a Realm osztály az összes beépített funkcióval rendelkezik. A lista nagyon hasonlít a beépített módszerek tömbjéhez és az objektumok indexelt előfizetéssel történő eléréséhez. A List as you see be van írva, és minden objektumnak azonos típusúnak kell lennie
  8. isUserHasTodos egy számított swift tulajdonság, és nem tárolja a birodalmi adatbázisban, amely visszatér, ha a felhasználónak van néhány feladata.
  9. végül elkészítjük auserIdésfirstName indexelt tulajdonságokat. Felülírásával indexedProperties statikus módszer adunk tömb tulajdonságok String formában. Az adatbázis szűrésekor vagy lekérdezésekor a hozzáférési időket javítjuk

2. ábra

útlevélmodell

a 3. ábrán látható módon létrehoztuk az útlevélmodellt a néhány tulajdonsággal

  1. passportNumber tárolja az útlevél adatait és expiryDate tárolja az útlevél lejárati dátumát, amelyet ezeket a tulajdonságokat szeretnénk tárolni használja @objc a dynamic kulcsszó mondani birodalom nem a motorháztető alatt mágikus
  2. hoztunk létre passport tulajdon User modell, ami azt jelenti, User az objektumnak megvan a passport objektum referencia mi van, ha azt akarjuk, hogy a passport objektum azt is tudja, melyik felhasználónak van ez az útlevél / hivatkozhat az ehhez az útlevélhez társított felhasználóra. A linkeket a LinkingObjects használatával hoztuk létre, ami azt jelenti, hogy létrehoztuk a ofUser tulajdonságot a Passportban, amelyek hivatkoznak az összes felhasználói objektumra, amelyek a Passport objektumot hozzárendelik a passport tulajdonságban. Az Alapadatokban inverz kapcsolatnak nevezte. Ez egy dinamikus gyűjtemény, amely megmondja, ki kapcsolódik az aktuális objektumhoz.

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 .

4.ábra

végeztünk a modell/séma létrehozása, és most itt az ideje, hogy nem a tényleges CRUD művelet

add objektum birodalomba

először törölje néhány fogalom, akkor képes lesz arra, hogy könnyen hozzá objektum birodalmába

amint az ábrán látható 5 kezdjük azzal, hogy egy példányát az alapértelmezett Realm argumentumok nélküli inicializálással. Az egyetlen módja annak, hogy hozzáférjen az adatbázishoz a birodalmi példányon keresztül. A Realm példány (más néven “a birodalom”) egy birodalmi adatbázist képvisel.A Realms tárolható lemezen (lásd init(path:)) vagy memóriában (lásd Configuration), amelyet a következő részekben fogunk látni. Realm a példányok nem biztonságosak a szálakban, és nem oszthatók meg a szálak vagy a feladási sorok között. Minden szálhoz új példányt kell létrehoznia, amelyben egy birodalom elérhető lesz.

az 5. ábrán látható módon, mivel ez egy friss alkalmazás, és egyetlen objektum sem volt tárolva az adatbázisban realm.isEmpty true értéket ad vissza, ami azt jelenti, hogy az adatbázis üres a konzolra nyomtatva

5. ábra

a 6. ábrán látható módon számos feladatot végeztünk

  1. megkapjuk a Realm adatbázis
  2. létrehozva Passport és három feladat todos
  3. létrehozva User objektum és hozzárendelés passport és todos hozzá. Amellett, hogy ez az inicializált tartomány opcionális tulajdonság, amely isEmailSubscriptionEnable és Usertype enum arany tagsággal

A 6.ábrán látható módon a tartományadatbázis még mindig üres és az inverz kapcsolat/ összekapcsoló objektum sem működik, mert nem adtuk hozzá ezeket az objektumokat a tartományhoz. A birodalmi objektumok (User,Passport,Todo)példányosíthatók és kezeletlen objektumokként használhatók (azaz még nem kerültek hozzá egy Birodalomhoz), csakúgy, mint a szokásos Swift objektumok. Ahhoz, hogy a tézisek által kezelt objektumok birodalomban legyenek, hozzá kell adni őket a Birodalomhoz

6.ábra

a 7. ábrán látható módon végül beillesztjük az objektumot a birodalom adatbázisába. Lépcsőzetes betétet hajtottunk végre a DB-be.

Megjegyzés: Az objektum minden módosítását (összeadás, módosítás és törlés) írási tranzakción belül kell végrehajtani.A birodalmi írási műveletek szinkron és blokkoló, nem aszinkron. Ha az A szál írási műveletet indít, akkor a B szál írási műveletet indít ugyanazon a területen, mielőtt az A szál befejeződik, az A szálnak be kell fejeznie és el kell végeznie a tranzakciót, mielőtt a B szál írási művelete megtörténik. Az írási műveletek mindig automatikusan frissülnek, így nem jön létre versenyfeltétel. Írási művelet lehet dobni hiba, mint fogy a lemezterület

  1. adtunk Felhasználó a birodalomba, és mivel hivatkozik passport és todos, ezek az objektumok is hozzá a Birodalomba.
  2. a nem felügyelt objektum hozzáadásával a birodalomhoz ezeket az objektumokat a konzolon látható módon kezeltük. Most passport hozzáférhet felhasználói objektum is. Most az adatbázisunk már nem üres
  3. végül beillesztjük az objektumot az adatbázisba, mivel beillesztjük az objektumot, amelyet hozzá kell adnunk az írási tranzakció blokkba, és hozzáadunk a birodalomhoz az Add metódus használatával a birodalmi példányon. Most, ha egy másik különálló objektum ugyanazzal az elsődleges kulccsal a felhasználó userId = 1 megkísérlik külön objektumként hozzáadni a Birodalomhoz, egy kivétel aktiválódik

7. ábra

az objektum fizikai tárolásának ellenőrzése

a parancs hibakereső kimeneten történő futtatásával megkapod annak a birodalmi fájlnak a címét, ahol az adatok tárolódnak

8.ábra

open default.realm A Realm Studio-ban a realm Studio a premier fejlesztői eszközünk, így könnyedén kezelheti a realm adatbázist és a realm platformot. A Realm Studio segítségével megnyithatja és szerkesztheti a helyi és szinkronizált tartományokat, és felügyelheti a Realm Object Server bármely példányát. Töltse le most Mac, Windows vagy Linux rendszerre.

9.ábra

a 10. ábrán látható módon a ténylegesen tárolt adatok. Lehet, hogy csoda Article és Person osztály is ott, mert néhány az én projekt osztály létrehozása modellek személy és cikk. Az alkalmazás futtatásakor a Realm az alkalmazás és a keretrendszerek összes osztályát megvizsgálja, és megtalálja azokat az osztályokat, amelyek a Realm Objektumosztályát alosztályozzák. Úgy véli, hogy ezeknek az osztályoknak a listája az Ön adatsémája, amely megmarad a lemezen vagy a memóriában.

10.ábra

objektum lekérése a Birodalomból

az összes felhasználói rekord lekérésének folyamata a Birodalomból a következő feladatokkal jár

  1. megkapjuk a birodalmi adatbázis példányát, és dobhat: egy NSError ha a tartományt nem lehetett inicializálni. Az alapértelmezett tartomány akkor jön létre, amikor meghívjuk init() paraméter nélkül
  2. hívott objektumok metódust birodalmi adatbázisban, amely visszaadja az összes objektumot az adott típusú tárolt Birodalomban, és visszaad egy eredményt az összes objektummal, amint az a 11. ábrán látható
  3. nyomtatott objektum a konzolon az adatok érvényesítéséhez, és az objektumok összekapcsolása jól működik

11. ábra

letöltöttük a felhasználót rekord az elsődleges kulcsból, amely szintén indexelt tulajdonság, így megkapjuk az opcionális felhasználói objektumot, mivel az ezzel az elsődleges kulccsal rendelkező objektum nem létezik. Az elsődleges kulcs lehet Int vagy String A javaslat a String. egyedi módon azonosítja a Tartományadatbázis konkrét objektumait.Ha az elsődleges kulcs értéke be van állítva egy adott objektumra, akkor azt soha nem lehet megváltoztatni.

12.ábra

amint az ábrán látható, néhány predikátum segítségével szűrtünk itt található az általunk használt operátorok listája

  1. Filter a
  2. Filter a nagybetűvel nem érzékeny a
  3. eset figyelmen kívül hagyásával megegyező értékekkel egyezik a
  4. {1,2,3} – ban a (z) {\displaystyle {{1,2,3}} filter A (Z)
  5. szűrés → találat, ha a firstName érték kezdődik.
  6. filter ha a keresztnév értéke megegyezik a li-vel.
  7. predikátum a Passport objektummal a passport számmal rendelkező felhasználót szeretnénk szűrni == ‘pass1’
  8. predikátum a Todos objektummal a tdodo-val rendelkező felhasználót szeretnénk szűrni a részleteket tartalmazza == ‘Need ot create rxswift blog’

a speciális lekérdezésekhez erősen ajánlott ahttps://academy.realm.io/posts/nspredicate-cheatsheet/ ez az nspredicate cheatsheet

megjegyzés: amit “tranziens (számított) tulajdonságoknak” nevezel, a birodalom “figyelmen kívül hagyott tulajdonságoknak”nevezi. Ezek olyan tulajdonságok, amelyeket a Realm nagyrészt figyelmen kívül hagy, így nem kerülnek tárolásra a db fájlban, módosíthatók az írási tranzakciókon kívül stb.Ez azonban azt is jelenti, hogy nem részesülnek a nem figyelmen kívül hagyott tulajdonságok, például a lekérdezések számos lehetőségéből. (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

élő eredmények

a tartomány szakaszból történő Lekérés Utolsó témája

a tartomány eredményhalmazai mindig a legfrissebb adatokat adják vissza. Az eredmények adatai soha nem elavultak. Ez azt jelenti, hogy soha nem kell újratöltenie az eredményeket a lemezről, vagy valahogy manuálisan frissítenie kell a memóriában lévő adatokat.

amint a 15. ábrán látható, megkaptuk az új felhasználót, és nem a realm.objects metódust használtuk, hanem az újonnan hozzáadott objektumot mutatjuk be a users változón . Ha a Core data background-ból származik, akkor újra le kell töltenie az objektumot a veremből

olvasás és írás történhet a projekt különböző pontjain, különböző szálakon, különböző folyamatokból, vagy a Realm Platform használatakor a világ bármely pontjáról. Az alkalmazás minden osztálya összpontosíthat az üzleti logikára, és elfelejtheti az elavult vagy gyorsítótárazott adatok fogalmát, mivel a Realm objektumok mindig naprakészek.

15.ábra

objektum módosítása a birodalomban

a 16. ábrán látható módon módosítjuk az elsődleges kulcsot, és azt kapjuk, hogy “az elsődleges kulcs nem módosítható egy objektum beszúrása után.”kivétel, mivel nem tudjuk frissíteni az elsődleges kulcsot . A Realm Docs elsődleges kulcs hozzá van adva egy Birodalomhoz, az elsődleges kulcs nem módosítható. Megoldási lehetőség a StackOverflow alkalmazásban

16.ábra

amint az a 17. ábrán látható, nem módosíthatja az objektum lekérését az írási tranzakció blokkján kívüli tartományból, ha ezen kívül próbál módosítani, akkor kivételt kap “‘az objektum módosítása az írási tranzakción kívül — először hívja a beginwritetransaction-t egy rlmrealm példányon.”

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

18. ábra

19. ábra

az utolsó példa nagyon érdekes a következő feladatokat hajtottuk végre a felhasználó frissítéséhez az új felhasználóval

  1. megkapjuk a felhasználót az elsődleges kulcsávaluserIdami 1
  2. létrehozott új User ugyanazzal az elsődleges kulccsal
  3. egy írási tranzakción, amelyet köteg hozzáadásának hívunk update method with update = true frissíti a felhasználót, amelynek elsődleges kulcsa = 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 a törölt fájlokhoz való csatolás a csatolási tulajdonságukat nullára állítja. Ha ezek az objektumok bármely Listatulajdonságból kapcsolódnak, akkor a rendszer eltávolítja őket a kérdéses listákból.

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 birodalmi objektum. Az ábrán látható módon realm.isEmpty igaz értéket ad vissza

24.ábra

néha létre kell hozni valamilyen hierarchiát a birodalmi objektumok között, ahogy azt a Swift osztályoknál megszoktuk. Sajnos a Realm jelenleg nem támogatja az objektum öröklődését a dobozon kívül . Megoldás: 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/

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.