====== 6. cvičení - Databáze, Content Provider a práce se soubory ====== [[https://edux.fit.cvut.cz/courses/BI-AND/tutorials/06/start|Cvičení na Eduxu]] * {{:bi-and:cviceni:tutorial06_reseni_cermak.zip|Eclipse project z 6. cvičení}} - **Pozor, nejedná se o stejnou verzi jako je na eduxu!** Tento projekt byl na mém cvičení mírně odlišný, než jak vypadalo oficiální zadání. * Hlavní rozdíl oproti oficiální variantě je, že se více (a lépe) používá samotný ContentProvider, o kterém celé cvičení bylo. * Magické objevení dat po jejich přidání a zmizení po jejich smazání je docíleno pomocí volání [[http://developer.android.com/reference/android/content/ContentResolver.html#notifyChange(android.net.Uri, android.database.ContentObserver, boolean)|ContentResolver.notifyChange(...)]] a [[http://developer.android.com/reference/android/database/Cursor.html#setNotificationUri(android.content.ContentResolver, android.net.Uri)|Cursor.setNotificationUri(...)]]. CursorAdapter si na cursoru [[http://developer.android.com/reference/android/database/Cursor.html#registerContentObserver(android.database.ContentObserver)|registruje]] vlastní ContentObserver, který po notifikaci cursoru (ke které dojde v ContentProvideru) na něm zavolá requery() a načte tak data znovu. * Dejte si pozor na to, že kód není optimální z hlediska využití UI threadu. * Všechny dlouho trvající operace (dotaz do databáze, práce se soubory) by se měly provádět mimo UI thread. * Buď můžete použít AsyncTask, jak bylo ukázáno na cvičení, nebo ještě lépe - využít [[http://developer.android.com/guide/topics/fundamentals/loaders.html|Loaders framework]], který je v novějších verzích Androidu a je backportovaný pomocí [[http://developer.android.com/sdk/compatibility-library.html|Compatibility library]]. * Další nedostatek: při přístupu k externímu úložišti (SD karta) byste vždy měli zkontrolovat, zda je dostupné, pomocí [[http://developer.android.com/reference/android/os/Environment.html#getExternalStorageState()|Environment.getExternalStorageState()]]