6. PERSISTENCE DAT BI-AND

Podobné dokumenty
11/29/11. (c) Miroslav Balík, Ondřej Kroupa, Martin Pelant. Obsah. Databáze Content Provider Soubory

KMI / TMA Tvorba mobilních aplikací. 6. seminář ZS 2016/2017 Středa 13:15-15:45

Návrh a tvorba WWW stránek 1/14. PHP a databáze

Kurz Databáze. Obsah. Dotazy. Zpracování dat. Doc. Ing. Radim Farana, CSc.

Databáze I. 5. přednáška. Helena Palovská

Databázové systémy. Cvičení 6: SQL

Databázové systémy. - SQL * definice dat * aktualizace * pohledy. Tomáš Skopal

Úvod do databázových systémů

Výčtový typ strana 67

Databáze I. Přednáška 4

Obchodní akademie a Jazyková škola s právem státní jazykové zkoušky Jihlava

SQL v14. 4D Developer konference. 4D Developer conference 2015 Prague, CZ Celebrating 30 years

InnoDB transakce, cizí klíče, neumí fulltext (a nebo už ano?) CSV v textovém souboru ve formátu hodnot oddělených čárkou

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.

George J. Klir. State University of New York (SUNY) Binghamton, New York 13902, USA

2. blok část B Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE

O Apache Derby detailněji. Hynek Mlnařík

Třídy a objekty. Třídy a objekty. Vytvoření instance třídy. Přístup k atributům a metodám objektu. $z = new Zlomek(3, 5);

8.2 Používání a tvorba databází

Práce s binárními soubory. Základy programování 2 Tomáš Kühr

Úvod do programovacích jazyků (Java)

KIV/ZIS cvičení 6. Tomáš Potužák

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

PL/SQL. Jazyk SQL je jazykem deklarativním, který neobsahuje procedurální příkazy jako jsou cykly, podmínky, procedury, funkce, atd.

Jaký je rozdíl v definicicíh VARCHAR2(20 BYTE) a VARCHAR2(20 CHAR):

Informační systémy 2008/2009. Radim Farana. Obsah. Dotazy přes více tabulek

Programování v C++ 3, 3. cvičení

Jazyk C# - přístup k datům

Algoritmizace a programování

Databáze II. 1. přednáška. Helena Palovská

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

Databáze. Velmi stručný a zjednodušený úvod do problematiky databází pro programátory v Pythonu. Bedřich Košata

Inovace a zkvalitnění výuky prostřednictvím ICT Databázové systémy MySQL základní pojmy, motivace Ing. Kotásek Jaroslav

Jazyk SQL databáze SQLite. připravil ing. petr polách

Databázové systémy Cvičení 5.2

ADT/ADS = abstraktní datové typy / struktury

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Administrace Oracle. Práva a role, audit

Programování v C++ 2, 4. cvičení

Generické programování

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

SQL - trigger, Databázové modelování

Textové soubory. alg9 1

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Inovace a zkvalitnění výuky prostřednictvím ICT. Základní seznámení s MySQL Ing. Kotásek Jaroslav

Databáze SQL SELECT. David Hoksza

Základy informatiky. 08 Databázové systémy. Daniela Szturcová

Úvod do programování - Java. Cvičení č.4

Západočeská univerzita v Plzni Katedra informatiky a výpočetní techniky. 9. června krovacek@students.zcu.cz

DUM 12 téma: Příkazy pro tvorbu databáze

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Programování v Javě I. Únor 2009

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

1 Webový server, instalace PHP a MySQL 13

Zápis programu v jazyce C#

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Databáze 2011/2012 SQL DDL (CREATE/ALTER/DROP TABLE), DML (INSERT/UPDATE/DELETE) RNDr.David Hoksza, Ph.D.

Použití databází na Webu

Transakce a zamykání. Administrace MS SQL Serveru (NDBI039) Pavel Hryzlík

1. Webový server, instalace PHP a MySQL 13

Jazyk C# (seminář 3)

Soubor jako posloupnost bytů

Oracle XML DB. Tomáš Nykodým

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 26.3.

Seminář Java II p.1/43

Sada 1 - PHP. 14. Úvod do jazyka SQL

5. POČÍTAČOVÉ CVIČENÍ

PŘETĚŽOVÁNÍ OPERÁTORŮ

Programování v Javě I. Leden 2008

Programování v jazyku C# II. 5.kapitola

Anotace a Hibernate. Aleš Nosek Ondřej Vadinský Daniel Krátký

Práce se soubory v Javě

B0M33BDT Technologie pro velká data. Supercvičení SQL, Python, Linux

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

public static void main(string[] args) { System.out.println(new Main().getClass().getAnnotation(Greet.class).text());

SQL. strukturovaný dotazovací jazyk. Structured Query Language (SQL)

Programovací jazyk Java

KTE / ZPE Informační technologie

OBJECT DEFINITION LANGUAGE. Jonáš Klimeš NDBI001 Dotazovací Jazyky I 2013

Úvod do databází. Modelování v řízení. Ing. Petr Kalčev

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

Maturitní témata z předmětu PROGRAMOVÉ VYBAVENÍ pro šk. rok 2012/2013

7. Datové typy v Javě

Vytváření a použití knihoven tříd

6. SQL složitější dotazy, QBE

Audit DB. Referát. Vypracoval: Zdeněk Doležal MFF UK Praha 11/5/06

PHP a Large Objecty v PostgreSQL

Datové struktury. alg12 1

Virtual private database. Antonín Steinhauser

PA152. Implementace databázových systémů

Databázové systémy II. KIV/DB2 LS 2007/2008. Zadání semestrální práce

Jazyk C# a platforma.net

PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory

Úvod do databázových systémů

8 Třídy, objekty, metody, předávání argumentů metod

6. PRÁCE S DATOVÝMI PROUDY

Databáze I. Přednáška 7

Práce se soubory. Úvod do programování 2 Tomáš Kühr

Transkript:

15.3.2013 1 Programování pro operační systém Android (BI-AND) (c) Autor a garant: M. Havryluk, Spolupráce: M. Balík, O. Kroupa, M. Pelant 6. PERSISTENCE DAT BI-AND

15.3.2013 2 Obsah Databáze Content Provider Soubory

15.3.2013 3 SQLite Nejrozšířenější RDBMS (nejenom) pro embedded zařízení Android, ios, Symbian, BlackBerry, MeeGo, webos Velmi malá (~275kB) a rychlá Public domain licence Použitá i ve webových prohlížečích a dalších aplikacích Chrome, Firefox, Opera, standard pro HTML5 Adobe Systems, Skype, Solaris

15.3.2013 4 Vlastnosti SQLite Transakce jsou atomické, konzistentní a trvanlivé (i po pádu systému) ACID Kompletní databáze uložená v 1 souboru Podpora většiny standardů SQL92 Výjimky a omezení Chybí RIGHT and FULL OUTER JOIN Částečně ALTER TABLE pouze RENAME a ADD COLUMN Částečná podpora triggerů chybí FOR EACH STATEMENT VIEWs jsou read-only Chybí GRANT a REVOKE Některé vlastnosti/kontroly nejsou implicitně zapnuty! http://www.sqlite.org/omitted.html

15.3.2013 5 Datové typy NULL INTEGER hodnota se znaménkem uložená v 1, 2, 3, 4, 6, nebo 8 bytech v závislosti na rozsahu hodnoty REAL Hodnota s plovoucí desetinnou čárkou uložená v 8-byte IEEE číslu s plovoucí desetinnou čárkou TEXT Řetězec (délka až 2 31-1 bytů) uložen v kódování DB (UTF-8, UTF-16BE nebo UTF-16LE). BLOB Binární data

15.3.2013 6 SQLite v Androidu Plná podpora pro SQLite databáze V různých verzích OS se používá různá verze SQLite DB je uložena ve vnitřní paměti zařízení Možnost uložit i na paměťovou kartu řada nevýhod a problémů Doporučené praktiky: Normalizovat data Zapouzdření přístupu k DB do pomocných tříd Neukládat do databáze soubory (obrázky, audio ) Po ukončení přístupu k DB je třeba ji uzavřít

15.3.2013 7 SQLiteOpenHelper Zajišťuje vytvoření (pokud neexistuje), otevření, upgrade, downgrade databáze 1. public class DictionaryOpenHelper extends SQLiteOpenHelper { 2. private static final int DATABASE_VERSION = 2; 3. private static final String DATABASE_NAME = "databaze"; 4. 5. DictionaryOpenHelper(Context context) { 6. super(context, DATABASE_NAME, null, DATABASE_VERSION); 7. } 8. 9. @Override 10. public void oncreate(sqlitedatabase db) { 11. String create = "CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" + 12. KEY_WORD + " TEXT, " + 13. KEY_DEFINITION + " TEXT);"; 14. db.execsql(create); 15. } 16. 17. @Override Zavolá se, pokud databáze není vytvořená Zavolá se, pokud se zvýší DATABASE_VERSION 18. public void onupgrade(sqlitedatabase db, int oldversion, int newversion) { 19. //Upgrade databaze většinou vytvoření dočasných tabulek a překopírování dat 20. //nebo smazání DB a vytvoření nové 21. } 22. }

15.3.2013 8 Přístup k databázi Pro získání přístupu použijeme náš DictionaryOpenHelper Samotnou databázi dostaneme pomocí dbhelper.getwritabledatabase(); 1. SQLiteOpenHelper dbhelper = new DictionaryOpenHelper(mCtx); 2. SQLiteDatabase mdb = dbhelper.getwritabledatabase(); Po provedení potřebných úkonů databázi zavřeme 1. mdb.close();

15.3.2013 9 Vkládání dat do databáze Po získání odkazu na databázi, provedeme vložení dat příkazem insert(table,nullcolumnhack,values); Metoda insert vrací ID právě vloženého řádku nebo -1, pokud nastala chyba ContentValues Dvojice klíč/hodnota Používá se při vkládání nebo updatování tabulek Klíč odpovídá jménu sloupce tabulky Vytvořit si třídu s konstantami klíče DB 1. ContentValues initialvalues = new ContentValues(); 2. initialvalues.put(key_word, "word"); 3. initialvalues.put(key_definition, "definice slova word -..."); 4. mdb.insert(dictionary_table_name, null, initialvalues);

15.3.2013 10 Vyhledávání v DB Návrhový vzor Query Object K prohledávání databáze slouží metoda query Vrací Cursor Prostředek pro procházení výsledky dotazu, čtení řádků a sloupců Po provedení potřebných úkonů je třeba Cursor zavřít 1. Cursor c = mdb.query(dictionary_table_name, 2. null, //sloupce 3. null, //klauzule WHERE 4. null, //parametry,pokud se vyskytují? ve WHERE 5. null, //groupby 6. null, //having 7. null);//orderby query(table_documents, new String[] {KEY_DOCUMENTS_ID, KEY_DOCUMENTS_CREATEDBY_ID }, KEY_ID + "=?, new String[] {id});

15.3.2013 11 Vyhledávání v DB Čtení obsahu DB probíhá až v momentě, kdy zavoláme příslušnou metodu Cursoru (getstring, getint ) Cursor pouze ukazuje na výsledek vyhledávání (šetření paměti) 1. Cursor c = mdb.query(dictionary_table_name, null, null, null, null, null, null); 2. if (c.movetofirst()) {//posune na začátek, vrátí false, pokud je cursor prázdný 3. int colword = c.getcolumnindex(key_word); //číslo sloupce "word" 4. int coldef = c.getcolumnindex(key_definition); //číslo sloupce "definition" 5. do { 6. String word = c.getstring(colword); 7. String def = c.getstring(coldef); 8.... 9. } while (c.movetonext()); //posune cursor na další řádek 10. c.close(); 11. }

15.3.2013 12 Databáze a životní cyklus activity DB je nutné po jejím otevření zavřít Open/close v rámci jednoho požadavku Pomalejší V rámci životního cyklu activity Pozor na správné pořadí open/close Nezavírat DB, pokud nejsou uzavřeny i cursory DB otevřená po celou dobu běhu aplikace? Obdobně je nutné zavřít i cursory Z důvodů paměťové náročnosti se nevyplácí používat různé formy ORM nebo vytvářet pomocné třídy pro obalení dat z databáze

15.3.2013 13 Další metody Cursoru movetoprevious() getcount() getcolumnindexorthrow(string columnname) getcolumnname(int columnindex) getcolumnnames() getcolumncount() movetoposition(int position) getposition() isclosed()

15.3.2013 14 Update dat v databázi Aktualizace dat se provádí pomocí metody update(table, values, whereclause, whereargs); Metoda vrací počet aktualizovaných řádků 1. ContentValues updatedvalues = new ContentValues(); 2. updatedvalues.put(key_definition, "nová definice"); 3. 4. mdb.update(dictionary_table_name, 5. updatedvalues, 6. KEY_WORD+"='word'", //klauzule WHERE 7. null); //parametry, pokud se vyskytují? ve WHERE

15.3.2013 15 Mazání dat z databáze Mazání dat se provádí pomocí metody delete(table, whereclause, whereargs); Metoda vrací počet smazaných řádků, pokud whereclause není null, jinak 0 Pro smazání všech řádků a získání počtu předáme do whereclause hodnotu "1" 1. mdb.delete(dictionary_table_name, 2. KEY_WORD+"='word'", //klauzule WHERE 3. null); //parametry, pokud se vyskytují? ve WHERE

15.3.2013 16 Zámek databáze Defaultně se SQLite stará sám o zamykání DB v kritických sekcích a zabraňuje tak poškození dat při zápisu z více vláken Pozor na (ne)vrácené výjimky použít např. frontu nebo jinou synchronizaci přístupu Časově náročné Pokud se k DB přistupuje pouze z jednoho vlákna, je dobré zamykání vypnout 1. mdb = dbhelper.getwritabledatabase(); 2. mdb.setlockingenabled(false);

15.3.2013 17 Programy pro práci s SQLite na desktopu SQLite Database Browser http://sqlitebrowser.sourceforge.net Sqliteman http://sqliteman.com/ Pozor na různé verze SQLite a s tím související odlišnosti v syntaxi zápisu např. NO ACTION

15.3.2013 18 Content Provider Prostředek pro poskytování dat Data uložena v SQLite DB, souborech, na webu apod. Závisí na konkrétní implementaci Jediný možný způsob, jak sdílet data napříč aplikacemi Výjimkou je: Mode - při přístupu k některým souborům IPC - Android Interface Definition Language (AIDL) Možné využívat i pro přístup k datům z vlastní aplikace Výhodou je zkrácení kódu

15.3.2013 19 Content Provider Každá aplikace může poskytovat svoje data přes Content Provider definované pomocí URI Pro přístup k datům poskytovaným ContentProviderem slouží ContentResolver Příklady (systémových) content providerů Kontakty SMS Zmeškané hovory Multimedia library

15.3.2013 20 Content Provider URI Musí se definovat unikátní URI A. Scheme - standardní předpona indikující, že data mají být zpracována Content Providerem Povinná je pouze část A a B B. Authority - identifikátor Provideru Musí být deklarována v AndroidManifestu Měla by obsahovat jméno balíčku, aby se zajistila jedinečnost C. Data type path - vymezení obsahu Může mít několik úrovní (land/bus, land/train, sea/ship ) D. Instance identifier - ID položky, kterou požadujeme Pokud chceme více záznamů, vynecháme

15.3.2013 21 Content Provider URI Definice provideru v AndroidManifestu 1. <provider 2. android:name=".myprovider" 3. android:authorities="cz.cvut.exampleprovider" /> Třída MyProvider.java Privátní CP - android:exported= false 1. public class MyProvider extends ContentProvider{ 2. public static final Uri CONTENT_URI = 3. Uri.parse("content://cz.cvut.exampleprovider"); 4.... 5. }

15.3.2013 22 Content Provider Je potřeba vždy implementovat 6 základních metod oncreate inicializace provideru, nastavení přístupu např. k DB gettype vrácení MIME dat u konkrétní URI MIME formát ve tvaru vnd.x.cursor.dir/y nebo vnd.x.cursor.item/y X název společnosti, projektu apod., Y název typu oddělený tečkami query výběr dat insert přidání dat update aktualizace dat delete smazání dat

15.3.2013 23 Content Provider - UriMatcher Pokud Provider poskytuje více typů dat, je potřeba pro každý typ vytvořit proměnnou a nastavit UriMatcher content://cz.cvut.exampleprovider/auta content://cz.cvut.exampleprovider/auta/3 content://cz.cvut.exampleprovider/lode content://cz.cvut.exampleprovider/lode/7 1. private static final int AUTA_ALL_ROWS = 1; 2. private static final int AUTA_SINGLE_ROW = 2; 3. private static final int LODE_ALL_ROWS = 3; 4. private static final int LODE_SINGLE_ROW = 4; 5. 6. private static final UriMatcher urimatcher; 7. static { 8. urimatcher = new UriMatcher(UriMatcher.NO_MATCH); 9. urimatcher.adduri("cz.cvut.exampleprovider", "auta", AUTA_ALL_ROWS); 10. urimatcher.adduri("cz.cvut.exampleprovider", "auta/#", AUTA_SINGLE_ROW); 11. urimatcher.adduri("cz.cvut.exampleprovider", "lode", LODE_ALL_ROWS); 12. urimatcher.adduri("cz.cvut.exampleprovider", "lode/#", LODE_SINGLE_ROW); 13. }

15.3.2013 24 Content Provider - gettype Vrací MIME požadavku v aktuální URI Formát: 1 položka: vnd.<autor>.cursor.item/<typ obsahu> Všechny položky: vnd.<autor>.cursor.dir/<typ obsahu> 1. @Override 2. public String gettype(uri uri) { 3. switch (urimatcher.match(uri)) { 4. case AUTA_ALL_ROWS: 5. return "vnd.cvut.cursor.dir/auta"; 6. case AUTA_SINGLE_ROW: 7. return "vnd.cvut.cursor.item/auta"; 8. case LODE_ALL_ROWS: 9. return "vnd.cvut.cursor.dir/lode"; 10. case LODE_SINGLE_ROW: 11. return "vnd.cvut.cursor.item/lode"; 12. default: 13. throw new IllegalArgumentException("Unsupported URI: " + uri); 14. } 15. }

15.3.2013 25 Content Provider - query Vrací Cursor s výsledky dotazu Analogicky se chovají ostatní metody (insert, update, delete) 1. @Override 2. public Cursor query(uri uri, String[] projection, String selection, 3. String[] selectionargs, String sortorder) { 4. switch (urimatcher.match(uri)) { 5. case AUTA_ALL_ROWS: 6. return db.fetchallcars(); 7. case AUTA_SINGLE_ROW: 8. String rownumber = uri.getlastpathsegment(); 9. int i = Integer.parseInt(rowNumber); 10. return db.fetchcar(i); 11.... 12. } Většinou se používá SQLiteQueryBuilder

15.3.2013 26 Content Provider - query Získaní Cursoru za použití SQLiteQueryBuilderu 1. @Override 2. public Cursor query(uri uri, String[] projection, String selection, 3. String[] selectionargs, String sortorder) { 4. SQLiteQueryBuilder querybuilder = new SQLiteQueryBuilder(); 5. switch (urimatcher.match(uri)) { 6. case AUTA_ALL_ROWS: 7. querybuilder.settables(table_car); 8. break; 9. case AUTA_SINGLE_ROW: 10. String rownumber = uri.getlastpathsegment(); 11. querybuilder.settables(table_car); 12. querybuilder.appendwhere(id + "=" + rownumber); 13. break; 14....//přístup do DB atd. 15. return querybuilder.query(db, projection, selection, selectionargs, orderby, null, sortorder); 16. }

15.3.2013 27 Content Resolver Slouží k přístupu do ContentProvideru Referenci získáme context.getcontentresolver(); Chová se podobně jako DB Update, insert, delete a query jsou stejné s výjimkou prvního parametru První parametr je URI požadovaného obsahu 1. Cursor c = getcontentresolver().query(contacts.content_uri, null, null, null, null); 2. startmanagingcursor(c); 3. int colname = c.getcolumnindex(contacts.display_name); 4. int colid = c.getcolumnindex(contacts._id); 5. if(c.movetofirst()){ 6. do{ 7. String jmeno = c.getstring(colname); 8. String id = c.getstring(colid); 9.... 10. }while(c.movetonext()); 11. } 12. stopmanagingcursor(c);

15.3.2013 28 Content Resolver Start/StopManagingCursor() je deprecated! startmanagingcursor & stopmanagingcursor Metody které provážou životní cyklus Cursoru s životním cyklem Activity Pokud se activita zastaví, Cursor se deaktivuje Když se activita opět obnoví, zavolá se requery(); Po skončení activity se Cursor uzavře Pro přístupu k systémovému ContentProvideru je většinou zapotřebí oprávnění Oprávnění pro přístup ke kontaktům (AndroidManifest.xml) 1. <uses-permission 2. android:name="android.permission.read_contacts" />

15.3.2013 29 Soubory Podpora standardních java.io tříd a metod 1. // Vytvorime novy File s adresarem, kde chceme mit soubor 2. File wallpaperdirectory = new File("/sdcard/myDirectory/"); 3. // Vytvorime adresare, pokud neexistuji 4. wallpaperdirectory.mkdirs(); 5. // Vytvorime novy File se cestou a jmenem souboru 6. File outputfile = new File(wallpaperDirectory, "newfile.txt"); 7. // Ziskame OutputStream 8. FileOutputStream fos = new FileOutputStream(outputFile); 9. // Zapiseme pozadovany obsah 10.fos.write(new String("text").getBytes()); 11.// Zavreme outputstream 12.fos.close(); Pokud zapisujeme do externího úložiště, potřebujeme oprávnění v AndroidManifestu 1. <uses-permission 2. android:name="android.permission.write_external_storage" />

15.3.2013 30 Soubory Jsou 2 základní umístění, kam můžeme ukládat soubory Interní úložiště Umístění ve složce: /data/data/<jméno aplikace>/files/ IOStreamy získáme pomocí : 1. os = openfileoutput("soubor", MODE_PRIVATE); 2. is = openfileinput("soubor"); Vhodné pro ukládání malých souborů Zkontrolovat jestli je externí úložiště připojeno! Doporučené umístění souborů aplikace: /sdcard/android/data/<jméno aplikace>/files/ Externí úložiště IOStreamy získáme pomocí : 1. //null =./, Environment.DIRECTORY_MUSIC =./Music,... 2. File dir = getexternalfilesdir(null); 3. File f = new File(dir, "soubor"); 4. os = new FileOutputStream(f); 5. is = new FileInputStream(f);

15.3.2013 31 Soubory - cache Pokud potřebujeme uložit soubory, jejichž smazáním nepřijdeme o žádná důležité data, použijeme cache Umístění bude /data/data/<jméno aplikace>/cache/ nebo /sdcard/android/data/<jméno aplikace>/cache/ Pokud bude docházet místo v úložišti, systém automaticky smaže tyto soubory 1. File dir = getcachedir(); // popr. getexternalcachedir(); 2. File f = new File(dir, "souborcache"); 3. os = new FileOutputStream(f); 4. is = new FileInputStream(f);

15.3.2013 32 Soubory další užitečné metody getfilesdir() vrátí absolutní cestu složky vašeho interního úložiště getdir(string name, int mode) vytvoří(nebo otevře existující) složku ve vašem interním úložišti deletefile() smaže soubor ve vašem interním úložišti filelist() vrátí pole aktuálně uložených souborů

15.3.2013 33 Soubory Složky /data/data/<jméno aplikace>/ a /sdcard/android/data/<jméno aplikace>/ budou po odinstalování aplikace automaticky smazány Uživatel může v nastavení aplikace dané soubory smazat ručně! Částečně se ustupuje od používání externího úložiště Shared Preferences 7. přednáška

15.3.2013 34 Další zdroje http://www.ibm.com/developerworks/xml/library/xandroidstorage/index.html http://kagii.com/post/6828016869/android-sqlite-locking