Práce s databázemi v Androidu není jen o jejich vytváření a naplňování daty. Důležitým aspektem je také správné spravování dat v případě změn struktury databáze nebo v případě nutnosti optimalizace výkonu aplikace při práci s velkými objemy dat. V této kapitole se zaměříme na několik aspektů, které vám pomohou lépe porozumět tomu, jak správně pracovat s databázemi a jak implementovat techniky pro efektivní přístup k datům na pozadí.
Představme si situaci, kdy potřebujete změnit verzi databáze v Android aplikaci. Při každé změně verze databáze je třeba implementovat metodu onUpgrade(), která se volá při změně verze databáze. Co je důležité, je že uživatel nemusí vždy aktualizovat aplikaci ve správném pořadí. Může například přeskočit verzi 2 a přejít rovnou na verzi 4, což znamená, že je potřeba zvládnout migraci dat mezi verzemi tak, aby nedošlo k jejich ztrátě.
Pokud například změníte strukturu existující tabulky, měli byste zvážit migraci dat na nový formát. To znamená, že budete muset načíst stávající data, upravit je podle nové struktury a následně je vložit zpět do databáze ve formátu, který odpovídá nové verzi. Tento proces je kritický, protože špatně provedená migrace může vést k poškození dat nebo jejich ztrátě.
Další výzvou, kterou přináší práce s databázemi, je nutnost provádět dotazy na pozadí, nikoliv na hlavním vlákně UI. Provádění dlouhotrvajících operací na hlavním vlákně může způsobit, že aplikace nebude reagovat, což se projeví chybou "Application Not Responding" (ANR). To znamená, že je nezbytné správně oddělit operace spojené s databázovými dotazy do samostatného vlákna.
V Androidu k tomu slouží API Loader, které bylo zavedené v Androidu 3.0. Loader umožňuje provádět databázové dotazy na pozadí a jakmile je dotaz dokončen, zavolá zpětnou vazbu na hlavním vlákně UI. Tento mechanismus nejenže automaticky zajistí vykonávání dotazů na pozadí, ale také umožní automatickou aktualizaci dat, pokud používáte Content Provider jako zdroj dat.
Pro lepší ilustraci této funkcionality si vezměme konkrétní příklad. Vytvoříme jednoduchou aplikaci, která načítá seznam slov z databáze a zobrazuje jej v ListView. V tomto případě budeme používat třídu CursorLoader pro načítání dat a třídu CursorAdapter pro propojení dat s uživatelským rozhraním.
Začneme tím, že vytvoříme nový adaptér, který bude dědit třídu CursorAdapter a bude zodpovědný za zobrazení jednotlivých položek seznamu. Následně vytvoříme třídu DictionaryLoader, která bude sloužit k načítání dat z databáze na pozadí.
Tento proces si ukážeme na kódu, kde v ActivityMain.java implementujeme potřebné zpětné volání pro práci s Loaderem a zajistíme, aby se data načítala efektivně na pozadí. Při každém přidání, aktualizaci nebo smazání záznamu z databáze budeme pomocí LoaderManageru obnovovat data v UI.
Dalším krokem je zajištění toho, aby byly všechny operace s databází prováděny na pozadí, což nejenže zlepší výkon aplikace, ale také poskytne uživatelsky přívětivější zkušenost bez zbytečných prodlev v UI. K tomu se implementují metody pro vytvoření a resetování Loaderu, které zajistí, že po dokončení operace na pozadí budou data okamžitě aktualizována na obrazovce.
Při implementaci těchto metod je důležité nezapomenout, že aplikace bude potřebovat správně reagovat na uživatelské akce, jako je kliknutí na položky seznamu nebo dlouhý stisk pro smazání záznamu. V takových případech bude aplikace využívat různé metody, jak zajistit hladkou interakci mezi uživatelem a databází.
Důležitým faktorem, na který je nutné si dát pozor, je správná správa verzí databáze a migrace dat při aktualizacích aplikace. Pokud byste měli špatně implementovanou logiku pro migraci dat, můžete se setkat s problémy, kdy stará data nebudou správně převedena do nové struktury, což by mohlo vést k chybám nebo dokonce ztrátě dat. Při práci s databázemi je také klíčové zajistit správnou synchronizaci mezi aplikací a uživatelskými daty, zejména při použití složitějších typů dat nebo při práci s externími zdroji.
Jak vypočítat úhel na základě dotyku uživatele v OpenGL ES
V tomto příkladu se zaměříme na metodu, jak vypočítat úhel rotace objektu na základě dotyku uživatele v aplikaci využívající OpenGL ES. Tento přístup umožňuje interaktivní ovládání grafických objektů a poskytuje uživatelům dynamický zážitek. Při vývoji aplikací s využitím OpenGL ES je klíčové efektivně zachytit a reagovat na dotyky, což je důležité nejen pro grafiku, ale i pro interaktivitu a uživatelský komfort.
V předchozím příkladu jsme se zabývali projekcí a kamerovým zobrazením při vykreslování, a tento recept staví na stejném základu. Cílem je umožnit uživateli rotovat objekt v aplikaci pomocí dotyku na obrazovce.
Začněme přípravou prostředí. V Android Studiu vytvořte nový projekt, který pojmenujte „RotateWithUserInput“. Pro tento účel zvolte výchozí možnosti pro telefon a tablet, přičemž jako typ aktivity vyberte „Empty Activity“. Tento projekt bude ukazovat, jak nastavit rotaci objektu na základě pozice dotyku na obrazovce.
Prvním krokem je přidání globálních proměnných pro výpočty středu obrazovky. V souboru MainActivity.java přidejte následující kód:
Následně je třeba upravit třídu GLRenderer tak, aby obsahovala proměnnou pro rotaci:
V metodě onDrawFrame() pak nahraďte existující kód vykreslování objektu novým, který zahrnuje rotaci:
Dále je potřeba upravit metodu onSurfaceChanged() pro správné nastavení středu obrazovky:
Dalším krokem je změna režimu vykreslování v konstruktoru CustomGLSurfaceView. V metodě setRenderer() přidejte následující řádek, aby aplikace vykreslovala pouze na vyžádání:
Nejdůležitější částí tohoto procesu je zachytávání dotyku uživatele. Vytvořte metodu onTouchEvent() v třídě CustomGLSurfaceView, která bude reagovat na pohyb prstu po obrazovce:
Po těchto úpravách je aplikace připravena na spuštění a interaktivní ovládání rotace objektu pomocí dotyku. Při každém pohybu prstu na obrazovce se vypočítá nový úhel rotace a objekt se otočí podle této hodnoty.
Tento přístup není omezen pouze na rotaci, ale je základem pro další interaktivní grafické efekty, jako je změna pozice nebo měřítka objektu. Vytváření vlastních tříd pro zpracování vstupu uživatele a přizpůsobení vykreslování podle aktuálních potřeb je klíčovým krokem k vytvoření dynamických aplikací s OpenGL ES.
Pokud se chce uživatel hlouběji ponořit do možností OpenGL ES, doporučuje se prostudovat další knihy a odkazy o této technologii. Důležité je i pochopení principů, jak efektivně pracovat s 3D grafikou na mobilních zařízeních a jak optimalizovat výkon aplikace pro různé platformy a hardware. Doporučuje se také zvážit používání frameworků jako Unreal Engine pro vývoj grafických aplikací, které již obsahují mnoho pokročilých funkcí a nástrojů.

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский