CRUD provoz pomocí RealmSwift Část 1

v této části se budeme zabývat:

  1. Co je Říše
  2. RealmSwift
  3. Vytvoření Komplexní Říši Model
  4. Proč používáme @objc a dynamické v Majetku
  5. Jeden a to-many Vztah, ve Sféře
  6. Jak uchovávat Vlastní enum ve Sféře
  7. Co je RealmOptional a Jak Ukládat Swift Volitelné Atomové Majetku
  8. Jak Počítačová Vlastnost funguje jako Přechodné Ubytování Ve sféře
  9. Jak to udělat indexování pro výkon zisk
  10. Co je Spojuje Objekt ve Sféře
  11. Komplexní Predikát Dotazy
  12. CRUD Operace
  13. Co je Živé Výsledky ve Sféře
  14. 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.

Číslo 1

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

  1. První jsme se dědí User class Object, což je Realm 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šech Object 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ů.
  2. firstName ukládá uživatelské jméno jako String. 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
  3. 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ůžeme userId primární klíč naléhavými primarykey 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
  4. 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 na Passport objekt bude ukládat
  5. privateUserType je obal vlastnost UserType 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 jako Int 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á.
  6. 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 jako RealmOptional 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í.
  7. 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
  8. 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.
  9. nakonec uděláme userId a firstName jako indexované vlastnosti. Přepsáním indexedProperties 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

Obrázek 2

cestovní Pas Model

, Jak je znázorněno na Obrázku 3 jsme vytvořili Pas model s několika vlastnostem.

  1. passportNumber ukládá informace o cestovní Pas a expiryDate ukládá datum platnosti pasu chceme, aby tyto vlastnosti obchod, který je důvod, proč jsme používání @objcdynamic klíčové slovo říct říše udělat si pod kapotou magie
  2. vytvořili Jsme passport vlastnost User model, což znamená, User objektu passport 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řili ofUser nemovitosti v Pasu, které mají odkaz na všechny Uživatelské objekty, které přiřadit Pas objekt v passport 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.

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 .

Obrázek 4

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

Obrázek 5

, Jak je znázorněno na Obrázku 6 jsme provedli řadu úkolů,

  1. instance Realm databáze
  2. Vytvořena Passport a tři úkoly jako todos
  3. vytvořil User objekt a přiřadit passport a todos k němu. Kromě toho inicializován Říše volitelná vlastnost, která je isEmailSubscriptionEnableUsertype 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

Obrázek 6

, 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

  1. 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.
  2. 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é
  3. 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

Obrázek 7

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.

Obrázek 8

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.

Obrázek 9

, Jak je znázorněno na Obrázku 10 data vlastně uložena. Možná se divíte, ArticlePerson 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.

Obrázek 10

Načíst Objekt z Říše

proces načítání všechny Uživatele, záznamy z Říše má následující úkoly

  1. 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áme init() bez parametru
  2. 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
  3. Tištěný objekt na konzole pro ověření údajů je tam a Propojení objektů v pořádku

Obrázek 11

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.

Obrázek 12

Jak je znázorněno jsme filtrovat pomocí nějakého Predikátu Zde je seznam operátorů, použili jsme

  1. filtr → zápasy hodnot se rovná
  2. filtr malá a velká písmena → zápasy hodnoty rovné ignorovat
  3. V {1,2,3} filtr → zápasy hodnotu ze seznamu hodnot.
  4. filtr → odpovídá, pokud hodnota firstName začíná na a.
  5. filtr → zápasy, pokud jméno obsahuje hodnotu s li.
  6. Predikát s Pas objekt, který chceme filtrovat Uživatele, který má číslo pasu == ‚pass1‘
  7. 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)

Figure 13

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

Figure 14

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

Obrázek 15

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

Obrázek 16

, 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í.“

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

Obrázek 18

Obrázek 19

Poslední příklad je velmi zajímavé, jsme provedli následující úkoly aktualizovat uživatele newUser

  1. dostaneme Uživatele s jeho primární klíč userId což je 1,
  2. Vytvořil nový User se stejným primárním klíčem
  3. 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

Figure 20

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

Figure 22

Figure 23

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,

Obrázek 24

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/

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.