Programowanie aplikacji dla technologii mobilnych mgr inż. Anton Smoliński
Agenda Nowości od Google N Android Studio 2.0 SQLite Co to jest? Ograniczenia Obsługa baz danych w Androidzie Tworzenie CURL Content Provider 2
Nowości od Google 3
Nowości od Google 9 marca 2016 plan wydania na Q3 2016 Nowa wersja Androida N Brak oficjalnej nazwy Trwa 1 z 5 etapów Preview (co miesiąc) Zmiany Poprawiono wydajność Zmieniono system praw dostępu do plików Nowy system powiadomień Podzielony ekran Nowe ustawienia Zmiana skalowania ekranu 4
Nowości od Google 7 kwietnia 2016 AndroidStudio 2.0 Zmiany: InstantRun szybkie uruchamianie tworzonych aplikacji (czasami bez jej kompilacji) Nowy AndroidEmulator przyspieszona integraca ADB (w końcu komunikacja z emulatorem jest szybsza niż z fizycznym urządzeniem) CloudTestLabIntegration narzędzie do testowania kompatybilności z innymi urządzeniami GPU Debugger Preview debuger dla OpenGL Przyspieszenie tworzenia Buildów 5
Nowości od Google 10 kwietnia 2016 Plotka o Swift jako języku programowania dla Androida http://android.com.pl/news/62172-google-apple-swift-javaprogramowanie-aplikacje/ Przesłanki odnośnie plotki: Problemy Google z Oracle Spotkanie reprezentantów Ubera, Facebooka i Google Zmiana licencji Swift na OpenSource Zapewnienie interoperacyjności aplikacji między iphone a Androidem 6
SQLite 7
. SQLite System zarządzania bazą danych Obsługuje deklaratywny język zapytań SQL Jest Lite-light Nie działa w oparciu o architekturę klient-serwer Zajmuje mało miejsca Wykorzystuje niewiele zasobów Baza danych przechowywana jest jako pojedynczy plik binarny Szybka okrojona z niektórych funkcji Działa na zasadzie B-drzew 8
SQLite SQLite nie implementuje pełnego standardu SQL-92 Brak FOREGIN KEY Wyzwalacze (triggery) mogą działać tylko w trybie FOR EACH ROW Jedynymi modyfikacjami struktury istniejącej tabeli może być zmiana jej nazwy lub dodanie nowej kolumny Brak zagnieżdżonych transakcji Możliwe jedynie łączenie lewostronne tabel (LEFT OUTER JOIN) Widoki są tylko do odczytu Brak użytkowników BD i szczegółowych uprawnień Ograniczone typy danych (5) 9
SQLite Typy danych w SQLite Null pusta wartość Integer liczba całkowita Text typ tekstowy REAL typ zmiennoprzecinkowy BLOB typ nieokreślony (dane binarne) 10
SQLite w Androidzie Plik bazy danych przechowywany jest w lokalizacji: /DATA/data/NAZWA_APLIKACJI/databases/NAZWA_BAZY Aby pracować poprawnie z bazą danych należy zaimportować pakiet android.database android.database.sqlite By obsługiwać bazę danych należy utworzyć klasę dziedziczącą po SQLiteOpenHelper. 11
SQLite w Androidzie Aby zachować kontrolę nad zmianami w strukturze bazy danych dodaje się zmienną statyczną private static final int DATABASE_VERSION = 1; Gdy wersja zostanie zmieniona Helper usunie starą bazę i stworzy nową, ze zmienioną strukturą Helper musi posiadać dwie metody oncreate oraz onupdate, lecz z racji tego, że obudowuje klasę posiada ich znacznie więcej (np. setery i getery) 12
SQLite w Androidzie Mechanizmem systemu Android do składowania i obsługi danych są ContentProviders (dostawcy treści). Baza SQLite to sterownik znajdujący się w 2 od dołu powłoce systemu (libraries) Korzystanie z tego sterownika wymaga obudowanie go w tzw. dostawcę treści, czyli klasę potomną po SQLiteOpenHelper Dostawcy treści mogą być zarówno prywatne dla danej aplikacji, jak i ogólnodostępne w systemie 13
SQLite w Androidzie Klucz podstawowy tabel tworzonych w systemie Android powinien mieć nazwę _id, gdyż niektóre klasy (np. SimpleCursorAdapter) operują na takiej nazwie pola Ograniczenie można ominąć stosując mapowanie SQL SELECT moje_id as _id, pole1, pole2; Aby utworzyć nową bazę danych (jej strukturę) można: Utworzyć ją programistycznie wywołując zapytania CREATE TABLE Skorzystać z zewnętrznych narzędzi i załadować odpowiedni plik 14
Bazy danych w Androidzie 15
Bazy danych w Androidzie Aby móc wykorzystywać bazy danych w systemie Android pierwszym krokiem jest utworzenie klasy odzwierciedlającej tabelę Załóżmy przykład: Aplikacja przechowująca dane książki Jedna tabela books Trzy pola id lub _id, title oraz author 16
Bazy danych w Androidzie public class Book { private int id; private String title; private String author; public Book(){} public Book(String title, String author) { super(); this.title = title; this.author = author; } } @Override public String tostring() { return "Book [id=" + id + ", title=" + title + ", author=" + author + "]"; } 17
Bazy danych w Androidzie Do obsługi bazy rekomendowane jest utworzenie klasy potomnej po SQLiteOpenHelper, która będzie odpowiadać za wszystkie operacje na danej bazie Metody oncreate i onupdate pozwalają na tworzenie struktury bazy i jej aktualizację przy wprowadzanych zmianach. W metodzie onupdate zazwyczaj usuwa się starą bazę i tworzy nową (o ile została zmieniona struktura) do tego celu używa się zmienną private static final DATABASE_VERSION Utworzona w ten sposób klasa jest warstwą pośrednią między aplikacją a bazą danych odpowiada modelowi z MVC W praktyce Helper powinien odpowiadać pojedyńczej tabeli z bazy danych 18
Bazy danych w Androidzie public class MySQLiteHelper extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 1; private static final String DATABASE_NAME = "BookDB"; @Override public void onupgrade(sqlitedatabase db, int oldversion, int newversion) { // Drop older books table if existed db.execsql("drop TABLE IF EXISTS books"); public MySQLiteHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void oncreate(sqlitedatabase db) { // SQL statement to create book table String CREATE_BOOK_TABLE = "CREATE TABLE books ( " + "id INTEGER PRIMARY KEY AUTOINCREMENT, " + "title TEXT, " + "author TEXT )"; } // create books table db.execsql(create_book_table); } } // create fresh books table this.oncreate(db); Aby użyć gotowej bazy z zewnętrznego pliku należy użyć metody SQLiteDatabase.openDatabase(), Lub przekopiować zawartość pliku bazy 19
Bazy danych w Androidzie CRUD Create Read Update Delete Realizowane poszczególnymi metodami w Helperze Metody wywołują i obsługują zapytania SQL Warto utworzyć zmienne statyczne z nazwami kolumn (w przypadku ich zmiany), oraz elementami wspólnymi dla wszystkich zapytań. 20
Bazy danych w Androidzie public void addbook(book book){ // 1. get reference to writable DB SQLiteDatabase db = this.getwritabledatabase(); // 2. create ContentValues to add key "column"/value ContentValues values = new ContentValues(); values.put(key_title, book.gettitle()); values.put(key_author, book.getauthor()); // 3. insert db.insert(table_books, // table null, //nullcolumnhack values); // 4. close db.close(); } Dadanie wpisu wymaga obiektu ContentValues, przechowującego pary Kolumna->Wartość db.insert() zwraca id utworzonego rekordu, lub -1 jeżeli nie uda się go utworzyć nullcolumnhack kolumny wypełnane nullami 21
Bazy danych w Androidzie public int updatebook(book book) { // 1. get reference to writable DB SQLiteDatabase db = this.getwritabledatabase(); // 2. create ContentValues to add key "column"/value ContentValues values = new ContentValues(); values.put("title", book.gettitle()); values.put("author", book.getauthor()); // 3. updating row int i = db.update(table_books, //table values, // column/value KEY_ID+" =?", // selections new String[] { String.valueOf(book.getId()) }); //selection args // 4. close db.close(); return i; Aktualizacja przebiega podobnie do dodania Dodatkowo należy ustawić warunek który obiekt ma być aktualizowany Metoda db.update() zwraca liczbę zmienionych wierszy } 22
Bazy danych w Androidzie public void deletebook(book book) { // 1. get reference to writable DB SQLiteDatabase db = this.getwritabledatabase(); // 2. delete db.delete(table_books, //table name KEY_ID+" =?", // selections new String[] { String.valueOf(book.getId()) }); //selections args } // 3. close db.close(); Usuwanie wierszy z podanej tabeli odbywa się za pomocą metody db.delete() Warunek rozbity jest na klauzulę i argumenty W klauzuli znak?[s] oznacza odwołanie do kolejnego argumentu Metoda db.delete() zwraca liczbę usuniętych wierszy By skasować wszystko klauzula powinna przyjmować wartość 1 23
Bazy danych w Androidzie ppublic List<Book> getallbooks() { List<Book> books = new LinkedList<Book>(); // 1. build the query String query = "SELECT * FROM " + TABLE_BOOKS; // 2. get reference to writable DB SQLiteDatabase db = this.getwritabledatabase(); Cursor cursor = db.rawquery(query, null); // 3. go over each row, //build book and add it to list Book book = null; if (cursor.movetofirst()) { do { book = new Book(); book.setid(integer.parseint(cursor.getstring(0))); book.settitle(cursor.getstring(1)); book.setauthor(cursor.getstring(2)); // Add book to books } } books.add(book); } while (cursor.movetonext()); // return books return books;.rawquery() przyjmuje zapytanie SQL zwracając kursor ustawiony na początek danego zapytania (wyników).query() robi to samo, lecz podajemy tylko parametry (a nie zapytanie SQL) Cursor iterator po bazie danych 24
Content Providers 25
Content Providers Idea Content Provider-ów Spójny interfejs dostępu do danych Możliwość zmiany źródła danych, bez konieczności zmiany innych elementów 26
Content Providers Content Providery umożliwiają dzielenie się danymi pomiędzy aplikacjami Np. książka kontaktów w Androidzie udostępnia Content Provider, dzięki któremu inne aplikacje mogą pobrać zapisane kontakty (i je edytować, usuwać, dodawać) ContactsContract.RawContacts.CONTENT_URI publiczny adres URI umożliwiający dostęp do zasobu kontaktów (podawany jako 1 parametr w ContentResolver) 27
Content Providers Struktura ContentProvider-a Adres URI: <prefix>://<authority>/<data_type>/<id> <prefix> - zawsze content:// <authority> - nazwa pakietu lub usługi systemowej <data_type> - typ danych zwracany przez dany provider <id> - specyficzny identyfikator zasobu Np.: content://contacts/people/5 28
Content Providers Tworząc Content Providera należy przeciążyć metody: oncreate() Uruchomiana przy starcie ContentProvidera. query() Pobiera żądanie, zwraca obiekt Cursor. insert() Dodanie nowego obiektu do ContentProvidera. delete() Usunięcie istniejącego obiektu z ContentProvidera. update() Edycja istniejącego obiektu w ContentProviderze. gettype() Zwraca MIME type przechowywanych obiektów (tożsame z tym co znajduje się w URI <data_type>) 29
Content Providers Content provider jako jeden z głównych komponentów do budowy aplikacji musi być zarejestrowany w pliku AndroidManifest.xml <provider android:name="studentsprovider" <android:authorities="com.example.provider.college"> </provider> Znając authorities i datatype można pobrać dane z innej aplikacji 30
Content Providers public class StudentsProvider extends ContentProvider { static final String PROVIDER_NAME = "com.example.provider.college"; static final String URL = "content://" + PROVIDER_NAME + "/students"; static final Uri CONTENT_URI = Uri.parse(URL); private SQLiteDatabase db; @Override public boolean oncreate() { Context context = getcontext(); DatabaseHelper dbhelper = new DatabaseHelper(context); db = dbhelper.getwritabledatabase(); return (db == null)? false:true; } 31
Content Providers @Override public Uri insert(uri uri, ContentValues values) { } @Override public Cursor query(uri uri, String[] projection, String selection,string[] selectionargs, String sortorder) { } @Override public int delete(uri uri, String selection, String[] selectionargs) { } @Override public int update(uri uri, ContentValues values, String selection, String[] selectionargs) { } 32
Content Providers @Override public String gettype(uri uri) { switch (urimatcher.match(uri)){ /** * Get all student records */ case STUDENTS: return "vnd.android.cursor.dir/vnd.example.students"; /** * Get a particular student */ case STUDENT_ID: return "vnd.android.cursor.item/vnd.example.students"; default: throw new IllegalArgumentException("Unsupported URI: " + uri); } } 33
Content Providers Aby korzystać z ContentProviderów udostępnianych przez aplikację nie trzeba posiadać specjalnych uprawnień Oznacza to, że każda aplikacja za pomocą interfejsu z ContentProvidera może Pobierać, Dodawać, Edytować, Usuwać elementy Aby zablokować którąś z tych opcji przy tworzeniu Content Providera odpowiednia metoda powinna nic nie robić 34
Koniec! mgr inż. Anton Smoliński 35