DATA STORAGE wprowadzenie Michał Mynarski środa, 26 października 11
DZISIAJ OPOWIEMY O TYM, JAK PRZECHOWYWAĆ DANE Shared Preferences Internal Storage External Storage SQLite Datebases Network Connection środa, 26 października 11
SHARED PREFERENCES Lekki mechanizm Tylko proste dane Zapisanie podstawowych, nieskomplikowanych danych tj. ustawienia interfejsu aplikacji Współdzielenie między wszystkimi komponentami aplikacji środa, 26 października 11
INTERNAL STORAGE Dane zapisywane są w domyślnym folderze na smartfonie/ tablecie Dostęp ma tylko dana aplikacja Po odinstalowaniu folder z zawartością jest usuwany środa, 26 października 11
PRZYKŁAD ZAPISU DO PLIKU String FILENAME = "hello_file"; String string = "hello world!"; FileOutputStream fos = openfileoutput(filename, Context.MODE_PRIVATE); fos.write(string.getbytes()); fos.close(); środa, 26 października 11
EXTERNAL STORAGE Wymagana karta SD (jako miejsce zapisu) Dane mogą być łatwo usunięte przez użytkownika urządzenia Wszystkie aplikacje mogą uzyskać dostęp do danych Zapisywanie i odczytywanie danych wymaga odpowiednich uprawnień środa, 26 października 11
SPRAWDZANIE NOŚNIKA boolean mexternalstorageavailable = false; boolean mexternalstoragewriteable = false; String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { // We can read and write the media mexternalstorageavailable = mexternalstoragewriteable = true; } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { // We can only read the media mexternalstorageavailable = true; mexternalstoragewriteable = false; } else { // Something else is wrong. It may be one of many other states, but all we need // to know is we can neither read nor write mexternalstorageavailable = mexternalstoragewriteable = false; } środa, 26 października 11
NETWORK STORAGE zapisywanie danych na witrynie internetowej lub na zewnętrznym serwerze używanie klas z paczek java.net* i android.net* środa, 26 października 11
SQLITE DATABASES Tworzenie baz danych, które mogą być używane przez wszystkie komponenty aplikacji Inne aplikacje nie mają dostępu do bazy danego programu środa, 26 października 11
ALE O TYM OPOWIE JUŻ KOLEGA OBOK ;) michal.mynarski@android.com.pl środa, 26 października 11
0x200 :: SQLite Baza danych SQLite Szymon Datko fenekpl@o2.pl
0x201 :: SQLite :: Wprowadzenie Silnik bazodanowy obsługujący język SQL. Jest darmowy, niewielki i łatwoprzenaszalny. Nie wymaga konfiguracji, ani żadnego zewnętrzego procesu RDBMS do administrowania nim. Obsługa transakcji według zasad ACID. Baza danych zapisywana jako samodzielny plik binarny. Wysoka wydajność w porównaniu z serwerami baz danych (przy obsłudze jednego użytkownika)
0x202 :: SQLite :: Wprowadzenie++ Powszechnie używana, nawet przez wielkie korporacje. Idealna do zastosowania w systemach wbudowanych. Brak konfiguracji praw dostępu do bazy danych. Brak obsługi jednoczesnego zapisu dla kilku użytkowników. Położenie w systemie Android: Katalog /data/data/<nazwa_pakietu>/databases/ Nazwa pliku jest jednocześnie nazwą bazy danych.
0x203 :: SQLite :: Typy danych Silnik SQLite nie zmusza nas do zdefiniowania jakie typy danych będą przechowywane. Wszystko w nim jest ciągiem znaków. Określenie typu danych przydatne jest jednak np. przy sortowaniu danych oraz w celu zapewnienia zgodności z innymi bazami danych. Podstawowe grupy typów danych w bazie danych SQLite: TEXT NUMERIC INTEGER REAL NONE
0x204 :: SQLite :: Grupy typów Istnieje 5 reguł przydzielenia danego typu do grupy typów: 1) Jeśli typ zawiera w nazwie INT to zostaje przydzielony do grupy INTEGER 2) Jeśli typ zawiera w nazwie CHAR, CLOB, bądź TEXT to zostaje przypisany do grupy TEXT 3) Jeżeli typ zawiera podciąg BLOB lub jeśli nie sprecyzowano typu to należy do rodziny NONE. 4) Jeżeli typ danych zawiera REAL, FLOA, bądź DOUB to jest on pokrewny z REAL. 5) W pozostałym przypadku jest to typ NUMERIC.
0x205 :: SQLite :: Grupy typów++ Nazwa typu danych użyta w poleceniu CREATE TABLE INT, INTEGER, TINYINT, SMALLINT, MEDIUMINT, BIGINT, UNSIGNED BIG INT, INT2, INT8 CHARACTER(20), VARCHAR(255), VARYING, CHARACTER(255), NCHAR(55), NATIVE, CHARACTER(70), NVARCHAR(100), TEXT, CLOB BLOB lub (brak sprecyzowanego typu) REAL, DOUBLE, DOUBLE, PRECISION, FLOAT NUMERIC, DECIMAL(10,5), BOOLEAN, DATE, DATETIME Grupa pokrewieństwa typu danych Reguła przypisania pokrewieństwa INTEGER 1 TEXT 2 NONE 3 REAL 4 NUMERIC 5
0x206 :: SQLite :: Składnia poleceń Zgodność z większością standardu SQL 92. Zapytania zakończone średnikami. Instrukcje SQL tradycyjnie zapisywane wielkimi literami. Podstawowe typy poleceń: DML (ang. Data Manipulation Language), np. SELECT, INSERT, UPDATE, DELETE DDL (ang. Data Definition Language), np. CREATE, DROP, ALTER DCL (ang. Data Control Language), np. GRANT, REVOKE, DENY
0x207 :: SQLite :: SELECT Polecenie SELECT służy do uzyskiwania danych z bazy. Składnia: SELECT pola FROM tabela [WHERE warunek][order kolejność][limit ilość]; Przykłady: SELECT * FROM SQLITE_MASTER; SELECT * FROM notes; SELECT imie, nazwisko FROM users WHERE nazwisko LIKE %kowal% ; SELECT _id, imie FROM users ORDER BY nazwisko ASC; SELECT * FROM piple WHERE age BETWEN 18 AND 50 LIMIT 10;
0x208 :: SQLite :: INSERT Polecenie INSERT służy do wprowadzania danych. Składnia: INSERT INTO tabela [(pole1, pole2)] VALUES ('wartość 1', 'wartość 2'); Przykłady: INSERT INTO users (id, imie, nazwisko) VALUES (null, 'Bridżit', 'Dżons'); INSERT INTO users (imie, nazwisko) VALUES ('Melon', 'Gips'); INSERT INTO users VALUES (null, 'Kasia', 'Kowalska');
0x209 :: SQLite :: UPDATE Polecenie UPDATE służy do modyfikacji istniejących pól. Składnia: UPDATE tabela SET pole1='wartość' [WHERE pole2='coś'] [LIMIT ilość]; Przykłady: UPDATE users SET nazwisko='nowak' WHERE nazwisko='kowalska'; UPDATE notes SET tresc='poprawiona treść' WHERE _id=3 LIMIT 1; UPDATE notes SET imie='adam';
0x210 :: SQLite :: DELETE Polecenie DELETE służy do usuwania rekordów. Składnia: DELETE FROM tabela [WHERE pole='wartość'][limit ilość]; Przykłady: DELETE FROM users WHERE _id=2 LIMIT 1; DELETE FROM users WHERE _id IN (2, 3, 4, 5); DELETE FROM notes WHERE 1=1; DELETE FROM notes;
0x211 :: SQLite :: CREATE Polecenie CREATE służy do tworzenia struktury bazy. Składnia: CREATE TABLE nazwa(pole1 atrybuty [, pole2 atrybuty [,...]]); Przykład: CREATE TABLE users(_id INTEGER PRIMARY KEY AUTOINCREMENT ASC, imie VARCHAR(20), nazwisko VARCHAR(20)); CREATE TABLE notes(_id INTEGER PRIMARY KEY AUTOINCREMENT ASC, tresc TEXT); CREATE TABLE test(i);
0x212 :: SQLite :: DROP Polecenie DROP służy do usuwania struktur bazy. Składnia: DROP TABLE nazwa; Przykłady: DROP TABLE users;
0x213 :: SQLite :: ALTER Polecenie ALTER służy do modyfikacji struktur bazy. Składnia: ALTER TABLE tabela ADD COLUMN nazwa atrybuty; ALTER TABLE tabela RENAME TO tabela_z_nową_nazwą; Przykłady: ALTER TABLE users ADD COLUMN nazwisko VARCHAR(20); ALTER TABLE notes RENAME TO notatki;
0x214 :: SQLite :: Komendy Poza standardo dostępnymi poleceniami języka SQL istnieją także specjalne komendy silnika SQLite. Przykładowe komendy:.dump [table] zrzut bazy/tabeli do formatu poleceń SQL.help wyświetla pomoc.read file wykonuje polecenia SQL z podanego pliku file.schema [table] wyświetla polecenie CREATE, jakiego użyto do utworzenia tabel (lub jednej, wskazanej tabeli).tables wyświeta istniejące tabele.exit wyjście
Code sample Piotr Giedziun piotrgiedziun@gmail.com
? Task List Store data in memory Store data in SQLite Download project http://dl.dropbox.com/u/7692650/pwr/taskmanagersqlite.tar.gz
View overview RelativeLayout TextView gravity="center" ListView android:layout_alignparentleft="true" android:layout_above="@id/addbutton" android:layout_below="@id/textview1" EditText android:layout_alignparentbottom="true" android:layout_alignparentleft="true" android:layout_toleftof="@id/addbutton" Button android:id="@+id/addbutton" android:layout_alignparentbottom="true" android:layout_alignparentright="true"
Activity main variables public void oncreate() {...... } tasklist = new ArrayList<Task>(); listadapter = new ArrayAdapter<Task>(this, android.r.layout.simple_list_item_1, tasklist); listview = (ListView) findviewbyid(r.id.simplelistview); edittext = (EditText) findviewbyid(r.id.edittext); addbutton = (Button) findviewbyid(r.id.addbutton); listview.setadapter(listadapter); after setcontentview
Create Task model Task.java public class Task { } public static final String TASK_ID = "id"; public static final String TASK_TEXT = "text"; public static final String TASK_TABLE = "tasks"; private long id; private String text; SQLite query CREATE TABLE tasks(id INTEGER PRIMARY KEY AUTOINCREMENT, text TEXT);
Create custom SQLiteOpenHelper SQLiteOpenHelper def: A helper class to manage database creation and version management. SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) oncreate(sqlitedatabase db) onupgrade(sqlitedatabase db, int oldver, int newver)
Model (MVC Pattern) CustomDbAdapter (database connection wraps) Open Close Insert Select Delete Sort (ORDER BY) etc.
Model (MVC Pattern) CustomDbAdapter Open SQLiteDatabase db;... CustomSQLiteOpenHelper h = new TasksSQLiteOpenHelper(context); db = h.getwritabledatabase(); //getreadabledatabase() Close Insert Select
Model (MVC Pattern) CustomDbAdapter Open Close db.close(); Insert Select
Model (MVC Pattern) CustomDbAdapter Open Close Insert Task t = new Task( Zjeść pizzę ); ContentValues values = new ContentValues(); values.put(task.task_text, t.gettext()); long id = db.insert(task.task_table, null, values); Select
Model (MVC Pattern) CustomDbAdapter Select Cursor c = db.query(task.task_table, new String[] {Task.TASK_ID, Task.TASK_TEXT}, null, null, null, null, null); Task t; if (c.movetofirst()) { do { t = new Task(c.getString(1)); t.setid(c.getint(0)); } while (c.movetonext()); } c.close();
AsyncTask =) asynchronous work publishes the results on the UI thread
AsyncTask
AsyncTask onpreexecute() doinbackground(params...) publishprogress(progress...) onprogressupdate(progress...) onprogressupdate(progress...) onpostexecute(result)
AsyncTask extends run AsyncTask<Params, Progress, Result> new AsyncTask().execute(arg1, arg2);