1. diel - Úvod do databáz vo Swift
Vítam Vás pri prvej lekcie kurzu o programovaní databázových aplikácií vo Swift. Ukážeme si, ako sa v iOS pracuje s Apple frameworkom Core Data a tiež alternatívnym riešením v podobe Realm.
K čomu databáze?
Možno vás napadlo, k čomu vlastne potrebujeme nejakú databázu. Dáta by sme rovnako dobre mohli ukladať sami do nejakých textových súborov, binárek, XML alebo niečoho podobného. Určite by to nejako fungovalo, alebo nie?
RDBMS
Označenie databázy je vlastne nepresné a v odbornej literatúre sa stretneme s označením RDBMS (Relation DataBase Management System). Slovensky je to preložené ako "databázový systém", čo znie naozaj hrozne a preto budem ďalej používať označenie databázový stroj alebo RDBMS. Databázový stroj nie je len úložisko dát. Jedná sa o veľmi sofistikovaný a odladený nástroj, ktorý za nás rieši veľa problémov a zároveň je extrémne jednoduchý na použitie. Záznamy nám z databázy totiž budú prichádzať ako bežné objekty. A od toho ako sú dáta fyzicky uložené alebo vyhľadávaná budeme plne odtienené, bude to za nás riešiť databázy.
S databázami sa často komunikuje pomocou jazyka SQL, čo sú v podstate ľudsky zrozumiteľné vety. V tomto prípade je ale problém s prenášaním dát medzi jazykom aplikácie (Swift) a SQL, ktoré žiadne objekty nepozná. Databázové frameworky pre Apple sú navrhnuté tak, aby sme jazyk SQL vôbec nepotrebovali (ak SQL neovládate, nebude vám chýbať).
Spolu s ukladaním dát je ale potrebné ďalej riešiť mnoho ďalších vecí. Asi by nás napadlo napr. Zabezpečenia alebo optimalizácie výkonu. RDBMS toho ale robí ešte oveľa viac. Nás bude zaujímať najmä spájanie niekoľkých otázok do transakcií, kedy sa séria otázok vykoná vždy celá alebo vôbec. Nestane sa, že by sa vykonala len časť. Hoci to nie je vždy úplne jednoduché, pri použití hotové databázy ju môžeme používať z viacerých vlákien a spoľahnúť sa, že sa nám nepodarí editovať tú istú položku v jeden okamih a zapríčiniť nekonzistentnosť dát. RDBMS dáta v tomto prípade zamkne a odomkne až po vykonaní zápisu. Tieto vlastnosti databázového stroja sú zhrňované skratkou ACID, poďme si ju vysvetliť.
ACID
ACID je akronym slov Atomicita (nedeliteľnosť), Consistency (konzistentnosť), Isolation (izolácia) a Durability (trvanlivosť). Jednotlivé zložky majú nasledujúci význam:
- Atomicita - Operácie v transakcii sa vykonajú ako jedna atomická (nedeliteľná) operácie. Tzn. že ak nejaká časť operácie zlyhá, vráti sa databázy do pôvodného stavu a žiadne časti transakcie nebudú vykonané. Reálny príklad je napr. Prevod peňazí na bankovom účte. Ak sa nepodarí peniaze odpočítať z jedného účtu, nebudú ani pripísané na účet druhý. Inak by bola databázy v nekonzistentnom stave. Ak by sme si prácu s dátami riešili sami, mohlo by sa nám toto veľmi jednoducho stať.
- Consistency - Stav databázy po dokončení transakcie je vždy konzistentné, teda validný podľa všetkých definovaných pravidiel a obmedzení. Nikdy nenastane situácia, že by sa databázy nachádzala v nekonzistentnom stave.
- Isolation - Operácie sú izolované a navzájom sa neovplyvňujú. Ak sa zíde v jeden okamih viac dotazov na zápis do rovnakého objektu, sú vykonávané postupne, ako vo fronte.
- Durability - Všetky zapísané dáta sú okamžite zapísané na trvanlivá úložisko (na pevný disk), v prípade výpadku el. energie alebo iného prerušenie prevádzky RDBMS všetko zostane tak, ako bolo tesne pred výpadkom.
Databáza (presnejšie databázový stroj) je teda čierna skrinka, s ktorou naše aplikácie komunikuje a do ktorej ukladá všetky dáta. Jej použitie je veľmi jednoduché a je odladená tak, ako by sme si sami zápis dát v programe asi ťažko urobili. Vôbec sa nemusíme starať o to, ako sú dáta fyzicky uložené, s databázou komunikujeme pomocou jednoduchého rozhrania. V dnešnej dobe sa vôbec neoplatí zaťažovať sa otázkou ukladanie dát, jednoducho siahneme po hotové databázu, ktorých je obrovský výber a sú väčšinou zadarmo. O databázu občas hovoríme ako o 3. vrstve aplikácie (1. vrstva je užívateľské rozhranie, 2. vlastné logika aplikácie, 3. je práve dátová vrstva).
Dostupné databázy na Apple platformách
V Apple svete existujú viacmenej 3 sofistikované možnosti, ako ukladať dáta. Keď chceme uložiť hiscore v hre, tak sa ešte bez databázy zaobídeme. Avšak pre dáta, ktoré medzi sebou majú nejaké vzťahy a v ktorých potrebujeme napr. Optimalizované vyhľadávať, je v podstate nepostrádateľná. Naše možnosti sú:
- core Data
- Realm
- SQLite
Poďme si ich vysvetliť.
Core Data
Core Dáta je oficiálny Apple framework pre ukladanie dát na Apple zariadeniach. Nie je to databázy, to znamená, že ide o rozhrania akým s dátami pracujeme a vnútorne Core Dáta používa na ukladanie dát nejaká ďalšie riešenie. Môžeme voliť medzi:
- XML súbory (nie je v iOS a je určené skôr pre debugging, má nízky výkon, ale je ľudsky čitateľné)
- Binárne súbory (rovnako ako XML úložisko poskytuje atomické ukladanie)
- databáza SQLite
- Operačná pamäť (táto možnosť nie je trvalé úložisko, ale umožňuje ukladať objekty so všetkými väzbami na všetko)
Vnútorné úložisko možno prepínať (napr. V začiatku projektu môžeme zvoliť pre možnosť kontroly čo máme uložené formát XML). Nemali by sme ale napr. Manipulovať s internou SQL databázou Core Data externými nástrojmi. Core Dáta sa používa na iOS, MacOS, watchOS a tvOS. Na iOS, ktorý nás bude zaujímať asi najviac, je k dispozícii od verzie 3.0, takže už viac ako desať rokov. Ide o roky preverené riešenie, ktoré Apple neustále vyvíja a ide o najčastejší spôsob, ako na týchto platformách ukladať väčšie množstvo dát.
Interne Core Data pracuje s už spomínanou SQLite databáz a vlastne nad ňou poskytuje ucelené rozhranie, cez ktoré s touto databázou pracujeme. To má rad výhod, napríklad nemusíme písať ručne SQL príkazy a spracuje dáta na objekty jazyka Swift. Navyše, keď k databáze budete pristupovať iba cez Core Data, tak sa nemôže stať, že by ste mohli poškodiť dáta a tým o ne prísť.
Core Data vie samo sledovať zmeny objektov a tie následne ukladať. Ponúka robustné možnosti, ako s dátami pracovať na pozadí pre náročnejších úkony a okrem iného za vás zvládne vyriešiť migrácie.
Migrácia vo svete Core Data a ďalších podobných frameworkov znamená najčastejšie, že sme rozšírili dátový model o nové vlastnosti alebo entity, napr. Sme užívateľovi pridali bankový účet, a potrebujeme na neho previesť dáta, ktoré máme už uložené podľa starého modelu, teda kde bankový účet užívatelia nemajú.
Core Dáta je v tomto ohľade dosť schopných a veľmi často migrácia zvládne automaticky bez vášho pričinenia. Napríklad nerobí problém pridanie / odobratie vlastností, ich premenovanie, pridanie nových entity či indexov. A keďže je Core Data priamo od Apple, tak je jeho úvodné nastavenie celkom jednoduché. Nemusíte inštalovať žiadne externé balíčky a tak podobne.
Realm
Databáza Realm nepatrí len do Apple sveta a ponúka podporu aj pre Javu, .NET, JavaScript či dokonca Objective-C. Okrem toho sa autori chvália viac ako 2 miliardami stiahnutí, takže sa určite nebudete učiť nejakú obskurní technológiu. Presadila sa najmä preto, že použitie Core Data bolo v začiatkoch pomerne komplikované. Funguje podobne ako Core Data, ale vnútorne si dáta ukladá rovno do objektového grafu namiesto ich mapovanie do SQLite databázy.
SQLite
SQLite sme tu už spomenuli v súvislosti s Core Data. Máme však možnosť ju používať aj priamo a nie cez Core Data.
SQLite je tzv. Relačnej databázy. Tento pojem označuje
databázu založenú na tabuľkách, nie na objektoch. Každá tabuľka obsahuje
položky jedného typu. Môžeme mať teda tabuľku uzivatele
,
ďalšiu tabuľku clanky
a ďalšie potrebné
komentare
.
Databázovú tabuľku si môžeme predstaviť napríklad ako tabuľku v Exceli. Tabuľka uzivatele
by
mohla vyzerať asi takto:
Meno | priezvisko | dátum narodenia | počet článkov |
---|---|---|---|
Jan | Novák | 11.3.1984 | 17 |
Tomáš | márny | 1.2.1989 | 6 |
Josef | nový | 20.12.1972 | 9 |
Michaela | Slavíková | 14.8.1990 | 1 |
Slovo relačné označuje vzťah (anglicky relation). Ten je medzi tabuľkami alebo medzi jednotlivými subjektmi v jednej tabuľke.
Vo svojej aplikácii teda môžeme pracovať s databázou SQLite priamo. Musíme potom ale riešiť ako Swift objekty prevedieme na riadky tabuliek a naopak, dáta totiž musíme posielať databáze pomocou jazyka SQL a získavame ich ako riadky. Core Dáta, ktorý SQLite databázu obaľuje, toto rieši za nás a servíruje nám rovno naše objekty.
Tejto technológii automatického prevádzanie objektov na riadky sa hovorí ORM (objektovo-relačné mapovanie). Realm vnútorne s relačné (tabuľkovou) databáz potom ani nespolupracuje a nemá teda čo prevádzať.
Technológia máme teda zmapované.
Core Data vs. Realm
Než sa pustíme do tvorby aplikácií využívajúcich databázy, tak si povieme, akú zvoliť. Možno vás neprekvapí, že pomyselný "víťaz" je celkom jasný a tým je Apple framework Core Data.
Má to hneď niekoľko dôležitých dôvodov. Jednak sa môžeme spoľahnúť, že bude do budúcnosti podporovaný. Je tu s nami od iOS 3 a nič nenaznačuje tomu, že by sa ho Apple chystal poslať do dôchodku. Namiesto toho ho stále vylepšuje a aktualizuje. V posledných verziách iOS je nastavenie Core Data dosť jednoduché, ako sami uvidíte, a Apple treba pridal aj viacmenej automatickú iCloud synchronizáciu.
A Core Data jednoducho patria medzi najpoužívanejšie riešenie, ignorovať ho môžete snáď len v prípade, že chcete robiť len hobby aplikácie a neplánujete kariéru ako iOS vývojári.
Realm nie je vôbec zlá technológie a prináša dosť revolučné pohľad na dáta a rad vecí je v ňom veľmi elegantné. Lenže to automaticky znamená, že váš projekt naraz závisí na dosť veľké externé knižnici a budete ju musieť udržiavať aktuálne.
Realm by som odporučil skúsiť, ak už máte Core Data zmáknuté a chcete si rozšíriť obzory vyskúšaním alternatívneho riešenia.
V budúcej lekcii, Vytvorenie ToDo aplikácie (plánovača úloh) pre iOS s ukladaním dát , vytvoríme základ ToDo aplikácie, na ktoré si ďalej ukážeme rôzne možnosti uloženia dát.