ebben a részben a következőket fogjuk fedezni:
mi a Birodalom
RealmSwift
komplex birodalmi modell létrehozása
miért használjuk a @objc-t és a dinamikát a tulajdonban
To-One and To-Many kapcsolat a birodalomban
hogyan tárolhatjuk az egyéni enumot a birodalomban
mi a RealmOptional és hogyan tárolhatjuk a Swift opcionális atomi tulajdonságát
hogyan működik a számított tulajdonság Átmeneti tulajdonságként a birodalomban
hogyan kell csinálni indexelés teljesítmény nyereség
mi összekötő objektum birodalomban
komplex predikátum lekérdezések
crud művelet
mi az élő eredmények birodalomban
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:
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.
firstName
a 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
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ó
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
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
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.
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
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.
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
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
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
megkapjuk a Realm
adatbázis
létrehozva Passport
és három feladat todos
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
adtunk Felhasználó a birodalomba, és mivel hivatkozik passport és todos, ezek az objektumok is hozzá a Birodalomba.
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
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
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
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ó
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
Filter a
Filter a nagybetűvel nem érzékeny a
eset figyelmen kívül hagyásával megegyező értékekkel egyezik a
{1,2,3} – ban a (z) {\displaystyle {{1,2,3}} filter A (Z)
szűrés → találat, ha a firstName érték kezdődik.
filter ha a keresztnév értéke megegyezik a li-vel.
predikátum a Passport objektummal a passport számmal rendelkező felhasználót szeretnénk szűrni == ‘pass1’
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
megkapjuk a felhasználót az elsődleges kulcsávaluserId
ami 1
létrehozott új User
ugyanazzal az elsődleges kulccsal
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/