v této části se budeme zabývat:
- Co je Říše
- RealmSwift
- Vytvoření Komplexní Říši Model
- Proč používáme @objc a dynamické v Majetku
- Jeden a to-many Vztah, ve Sféře
- Jak uchovávat Vlastní enum ve Sféře
- Co je RealmOptional a Jak Ukládat Swift Volitelné Atomové Majetku
- Jak Počítačová Vlastnost funguje jako Přechodné Ubytování Ve sféře
- Jak to udělat indexování pro výkon zisk
- Co je Spojuje Objekt ve Sféře
- Komplexní Predikát Dotazy
- CRUD Operace
- Co je Živé Výsledky ve Sféře
- Věci vyhnout, když Upravit objekty Realm
Realm je multiplatformní databáze mobilních objektů. Je to velmi rychlé, výkonné a snadno použitelné ve srovnání s jádrovými daty a Sqlite. Používá svůj úložný mechanismus pro uložení objektu jako JSON na disku ve srovnání s jádrovými daty, která používá Sqlite jako jeho backend. Je napsán v cross-platform C++ , takže funguje přesně stejným způsobem na Android, iOS, macOS nebo jakékoliv jiné platformě.
RealmSwift
většina Realm je open-source, ale tajná omáčka za platformou Realm je jádro DB engine napsané od nuly v C++. RealmSwift je obal kolem rámce Objective – C Realm a Objective-C Realm framework je obal kolem Realm Core DB engine.
začínáme
V tomto tutoriálu budeme pracovat na těchto modelů, jak je znázorněno na Obrázku 1,
Uživatel → je To model, který obsahuje informace o uživateli, ve které userId
je to primární. Má také vztah k jednomu modelu pasu a k mnoha vztahům k úkolům Todo. (Uživatel může mít pouze pas a má mnoho úkolů todo)
Passport → je to model, který obsahuje informace o pasu uživatele a má také zpětný odkaz User
objekt.
Todo → je to model, který obsahuje úkoly uživatele a má také zpětný odkaz User
objekt.
Uživatelská Model
, Jak je znázorněno na Obrázku 2 jsme vytvořili Uživatelský model a přidává několik vlastností:
- První jsme se dědí
User
classObject
, což jeRealm Object
. Objekty Realm jsou v podstatě standardní datový model, podobně jako jakýkoli jiný standardní datový model, který jste definovali ve svých aplikacích. Jediný rozdíl je v tom, že jsou podpořeny vytrvalostí a schopnostmi říše. Při pohledu do všechObject
Třída Realm jsou schopni odvodit vaše schéma. Každý model, který chcete přetrvávat, musíte zdědit z třídy objektů. -
firstName
ukládá uživatelské jméno jakoString
. JelikožRealmSwift
je wrapper kolem Objective-C Říše framework Typy, jako String, Data a Údaje jsou sub-třídy NSObject v Objective-C, takže můžete zvážit, je, typy objektů v rychlém stejně. Kromě toho @objc znamená, že chcete svůj Swift kód (třída, metoda, vlastnost atd.) Chcete-li být viditelný z Objective-C, zatímco dynamic znamená, že chcete použít Objective – C dynamic dispatch. Aby se jednoduché rychlé objekt ukládá do databáze Říše používá Objective-C dynamické odesílání funkce pro práci pod kapotou -
userId
ukládá id Uživatele, který působí jako primární klíč. Jako primární klíč můžete nastavit jednu z vlastností objektu. Obvykle vlastnost, která se jednoznačně identifikuje, to je hlavní kandidát na primární klíč. To vám pomůže rychlé vyhledávání nebo upravit objekt v databázi. Jak je znázorněno na Obrázku 2 můžemeuserId
primární klíč naléhavýmiprimarykey
statické funkce. Výchozí implementace této metody vrátí nulu. Poznámka:userId
působí jako Objective C primitivní typ Int, protože to je wrapper kolem Objective C Říše -
passport
vlastnost ukládá uživatelské informace o cestovní pas, který je další Oblast Objektu. Vytvořili jsme To-One vztah s modelem pasu. To-one vztah / objekt odkaz, ve kterém jeden objekt říše ukazují na jiný objekt říše. Když vytvoříte vztah s jiným objektem Realm, jeho vlastnost musí být volitelného typu. V pas variabilní ukazatel, odkaz naPassport
objekt bude ukládat -
privateUserType
je obal vlastnostUserType
od UserType je swift enum nemůžeme ukládat přímo na Říši. Všechny jeho hodnoty případu by měly implicitně přiřazenou surovou hodnotu odpovídající názvu případu. Tuto surovou hodnotu použijete k zachování možností enum jakoInt
v Realm. Ale klient přistupuje k počítačové vlastnosti enum a pod kapotou ENUM raw value / atomic value ukládá do databáze, která není pro klienta viditelná. - vlastnosti String, NSDate a NSData lze deklarovat jako volitelné nebo nepovinně pomocí standardní syntaxe Swift.Volitelné číselné typy jsou deklarovány pomocí RealmOptional. Od RealmSwift je wrapper kolem Objective C Říše, a tam je žádné volitelné Int v Objective C to je důvod, proč Říše ho vytvořil typ RealmOptional pro tyto scénáře. Všechny objektivní C primitivní typ vyžadují v Swift s volitelným budete muset použít RealmOptional . Poznámka: RealmOptional vlastnosti nemohou být deklarovány jako dynamické a @objc klíčové slovo, protože obecné vlastnosti nemohou být zastoupeny v Objective C runtime, který je používán pro dynamické odeslání dynamické vlastnosti, a by měla být vždy deklarována s. Protože je to Třída Realm, má všechny funkce, které má objekt Realm persist. Jak je znázorněno na Obrázku 2
isEmailSubscriptionEnable
budeme deklarovat jakoRealmOptional
Bool znamená, že může být nulová, jsme použili nechat od jeho referenční typ a nechceme, aby jeho adresu, aby se to v budoucnu změní. - jak je znázorněno na obrázku 2 Uživatel může mít mnoho todos, což je sbírka Realm Todo objektů . Seznam jako třída Realm pro uložení kolekce instancí objektů Realm. Vytvořili jsme to-Many vztah s modelem Todo. To-many vztah, ve kterém jeden objekt říše ukazuje na sbírku objektu říše. Používáte-li normální Swift pole pro uložení kolekce Realm objektu dostanete výjimku. Poznámka: jako RealmOptional seznam nemůže být deklarován jako dynamické a @objc Klíčové slovo, protože jeho třída Realm se všemi vestavěnými funkcemi. Seznam je velmi podobný Array pro vestavěné metody a přístup k objektům pomocí indexovaného předplatného. Seznam, jak vidíte, je to napsaný a všechny objekty by měly být stejného typu
-
isUserHasTodos
je počítačová swift majetku a nebude ukládat v oblasti databáze, která vrátí, zda uživatel má nějaké úkoly, které dělat, nebo ne. - nakonec uděláme
userId
afirstName
jako indexované vlastnosti. PřepsánímindexedProperties
statické metody poskytujeme pole vlastností ve formě řetězce. My indexovány na vlastnosti zlepšit přístup časy, kdy filtrování a dotazování databáze
cestovní Pas Model
, Jak je znázorněno na Obrázku 3 jsme vytvořili Pas model s několika vlastnostem.
-
passportNumber
ukládá informace o cestovní Pas aexpiryDate
ukládá datum platnosti pasu chceme, aby tyto vlastnosti obchod, který je důvod, proč jsme používání@objc
dynamic
klíčové slovo říct říše udělat si pod kapotou magie - vytvořili Jsme
passport
vlastnostUser
model, což znamená,User
objektupassport
odkaz na objekt co když chceme, pas objekt také vědět, který uživatel má tento pas / odkaz na uživatele spojené s touto cestovní pas. Vytvořili jsme zpětné odkazy pomocí LinkingObjects což znamená, že jsme vytvořiliofUser
nemovitosti v Pasu, které mají odkaz na všechny Uživatelské objekty, které přiřadit Pas objekt vpassport
majetku. V základních datech to nazval jako inverzní vztah. Je to dynamická sbírka, která vám říká, kdo odkazuje na aktuální objekt.
As shown in Figure 4 we created Todo
Realm model with has a backlink to the all the users pointing to particular task .
Skončili jsme s model / schéma vytváření a teď je čas udělat skutečné CRUD operace
Přidat Objekt do Říše
Jsme první jasný nějaký pojem, pak budeme moci snadno přidat objekt v Říši,
, Jak je znázorněno na Obrázku 5 můžeme začít tím, že instance výchozí Realm
inicializace to bez jakýchkoliv argumentů. Jediný způsob, jak můžete přistupovat k databázi prostřednictvím instance realm. Realm
instance (také označovaná jako „Realm“) představuje databázi Realm.Realms mohou být buď uloženy na disk (viz init(path:)
) nebo v paměti (viz Configuration
) uvidíme v nadcházející části. Realm
instance nejsou bezpečné pro vlákna a nelze je sdílet mezi vlákny nebo ve frontách odeslání. Musíte vytvořit novou instanci pro každé vlákno, ve kterém bude přístupná oblast.
, Jak je znázorněno na Obrázku 5, protože to je svěží app a ne byl objekt uložen v databáze realm.isEmpty
vrací true, znamená, databáze je prázdná, jak tisknout na konzole
, Jak je znázorněno na Obrázku 6 jsme provedli řadu úkolů,
- instance
Realm
databáze - Vytvořena
Passport
a tři úkoly jakotodos
- vytvořil
User
objekt a přiřadit passport a todos k němu. Kromě toho inicializován Říše volitelná vlastnost, která jeisEmailSubscriptionEnable
Usertype
enum s zlaté členství
, Jak je znázorněno na Obrázku 6 říši databáze stále prázdná a inverzní vztah/ Propojení objektu je taky nefunguje, protože jsme nevěděli, přidá tyto objekty do říše. Objekty Realm (User, Passport, Todo)mohou být instancovány a použity jako nespravované objekty (tj. Aby se práce objekty spravované Říše budete muset přidat je do Říše
, Jak je znázorněno na Obrázku 7 jsme se konečně vložit objekt do Sféry databáze. Provedli jsme kaskádovou vložku do DB.
Poznámka: Všechny změny objektu (přidání, úprava a smazání) musí být provedeno do zápisu transakce.Operace zápisu říše jsou synchronní a blokující, ne asynchronní. Pokud nit zahájí operaci zápisu, pak nit B začíná operace zápisu na stejné Oblasti před nit je hotový, nitě musí dokončit a zavázat své transakce předtím, než vlákno B je operace zápisu probíhá. Operace zápisu se vždy automaticky obnovují, takže není vytvořena žádná podmínka závodu. Operace zápisu může hodit chybu, jako je nedostatek místa na disku
- přidali jsme uživatele do vaší říše a protože odkazuje na passport a todos, tyto objekty jsou také přidány do říše.
- přidáním nespravovaného objektu do říše jsme tyto objekty spravovali nyní, jak je uvedeno v konzole, naše zpětné odkazy fungují. Nyní passport může přistupovat k objektu uživatele stejně. Nyní naše databáze je ne více prázdné
- Jsme se konečně vložit objekt do databáze, protože máme vložení objektu musíme přidat v zápisu transakční blok a přidáme do říše pomocí add metodu na Říši stupně. Nyní, Když další samostatný objekt se stejným primárním klíčem Uživatele s
userId = 1
je pokusil být přidán jako samostatný objekt do Říše, výjimku bude spuštěna
Zkontrolujte, zda Objekt Fyzicky Obchod
spuštěním tohoto příkazu ladicího programu výstupní dostanete adresu říše souboru, kde je uložena vaše data.
Otevřít
default.realm
v Říši Studio
Říše Studio je naše premiéra vývojářský nástroj, postavený, takže můžete snadno spravovat Říši Databáze a Říše Platformy. S Realm Studio můžete otevírat a upravovat místní a synchronizované říše a spravovat libovolnou instanci serveru Realm Object. Stáhněte si ji nyní pro Mac, Windows nebo Linux.
, Jak je znázorněno na Obrázku 10 data vlastně uložena. Možná se divíte, Article
Person
třídy i tam, protože v některých z mých projekt třídy vytvářet modely Osobu a Článek. Když aplikace běží, Realm introspects všechny třídy v aplikaci a rámců a najde ty třídy, které podtřídy objekt třídy Realm je. Považuje seznam těchto tříd za vaše datové schéma, které bude přetrvávat na disku nebo v paměti.
Načíst Objekt z Říše
proces načítání všechny Uživatele, záznamy z Říše má následující úkoly
- instance Říše Databáze, a to může hody:
NSError
pokud Říši nemohl být inicializován. Výchozí oblast je vytvořena, když říkámeinit()
bez parametru - Nazývají objekty metody na Oblast databáze, která vrátí všechny objekty daného typu uložené v Říši a vrátí Výsledky s všechny objekty, jak je znázorněno na Obrázku 11
- Tištěný objekt na konzole pro ověření údajů je tam a Propojení objektů v pořádku
Jsme přitažené za vlasy Uživatele záznam z primárního klíče, který je také indexovanou vlastností, takže získáme volitelný uživatelský objekt, protože objekt s tímto primárním klíčem nemusí existovat. Primární klíč může být Int
nebo String
doporučení je použít String.
jednoznačně identifikovat konkrétní objekty v Říši databáze.Jakmile je hodnota primárního klíče nastavena na konkrétní objekt, nelze ji nikdy změnit.
Jak je znázorněno jsme filtrovat pomocí nějakého Predikátu Zde je seznam operátorů, použili jsme
- filtr → zápasy hodnot se rovná
- filtr malá a velká písmena → zápasy hodnoty rovné ignorovat
- V {1,2,3} filtr → zápasy hodnotu ze seznamu hodnot.
- filtr → odpovídá, pokud hodnota firstName začíná na a.
- filtr → zápasy, pokud jméno obsahuje hodnotu s li.
- Predikát s Pas objekt, který chceme filtrovat Uživatele, který má číslo pasu == ‚pass1‘
- Predikát s Todos objekt, který chceme filtrovat Uživatele, který má nějaké tdodo obsahuje podrobnosti == ‚je Třeba vytvořit ot RxSwift blog‘
Pro pokročilé dotazy, je vysoce doporučeno, aby vidět https://academy.realm.io/posts/nspredicate-cheatsheet/ NSPredicate taháku
Poznámka: to, Co označujeme jako „přechodné (počítačová) – vlastnosti“, Říše označuje jako „ignorovány vlastnosti“. To jsou vlastnosti, které jsou z větší části ignorovány Říše, takže nebudou uloženy v db souboru, může být mutovaný mimo psát transakce, atd.To však také znamená, že nevyužívají mnoho možností ignorovaných vlastností,jako jsou dotazy. (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 výsledky
Poslední téma, na načítání z Říše části
Říše sady výsledků vždy vrátit na nejnovější up-to-aktuální data. Data ve výsledcích nejsou nikdy zastaralá. To znamená, že už nikdy nebudete muset znovu načíst výsledky z disku nebo nějakým způsobem ručně obnovit data v paměti.
, Jak je znázorněno na Obrázku 15 máme nového uživatele, a my ne načíst pomocí realm.objects
metody namísto nově přidaný objekt, jsou uvedeny na uživateli proměnné . Pokud přijdete z Hlavní data na pozadí, budete muset znovu přitažené za vlasy objekt ze zásobníku.
Čtení a psaní se může stát na různých místech v projektu, na různých vláknech, z různých procesů, nebo při použití Říše Platformu, z libovolného místa na světě. Každá třída v aplikaci se může zaměřit na obchodní logiku a zapomenout na pojem zastaralých nebo uložených dat, protože objekty Realm jsou vždy aktuální.
Upravit Objekt Na Říši
, Jak je znázorněno na obrázku 16 můžeme se mění primární klíč a my jsme si „Primární klíč nemůže být změněn poté, co objekt je vložen.“výjimka, protože nemůžeme aktualizovat primární klíč . Z Realm Docs je primární klíč přidán do Realm, primární klíč nelze změnit. Řešení → Vyjměte a znovu vložte objekt, nebo se tato otázka na stackoverflow
, Jak je znázorněno na Obrázku 17 nemůžete upravovat objekt stažen z říše mimo napsat,, transakční blok, pokud se pokusíte upravit mimo to dostanete výjimkou „‚se Snaží změnit předmět mimo zápis transakce — call beginWriteTransaction na RLMRealm instance první.“
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
Poslední příklad je velmi zajímavé, jsme provedli následující úkoly aktualizovat uživatele newUser
- dostaneme Uživatele s jeho primární klíč
userId
což je 1, - Vytvořil nový
User
se stejným primárním klíčem - Na zápis transakce říkáme přidat šarže aktualizovat metodu s update = true bude aktualizovat uživatele, který má primární klíč = 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 propojení s odstraněnými nastaví jejich vlastnost propojení na nulu. Pokud jsou tyto objekty propojeny z jakýchkoli vlastností seznamu, jsou z dotyčných seznamů odstraněny.
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 objekt říše. Jak je znázorněno na Obrázku realm.isEmpty
vrací true,
Někdy je třeba postavit nějaká hierarchie mezi Sféry objektů, stejně jako jste zvyklí dělat s Swift třídy. Realm bohužel v současné době nepodporuje dědičnost objektů po vybalení z krabice . řešení: 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/