Programowanie urządzeń mobilnych. dr inż. Andrzej Grosser na podstawie wykładu dr inż. Juliusza Mikody

Podobne dokumenty
akademia androida Składowanie danych część VI

Programowanie aplikacji dla technologii mobilnych. mgr inż. Anton Smoliński

Programowanie aplikacji dla technologii mobilnych. mgr inż. Anton Smoliński

Bazy danych 7. SQL podstawy

Programowanie w języku Java. Bazy danych SQLite w Javie

Język SQL, zajęcia nr 1

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

DATA STORAGE. wprowadzenie Michał Mynarski. środa, 26 października 11

Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski.

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

Android - Kontakty. Łukasz Dudzioski

Wprowadzenie do BD Operacje na bazie i tabelach Co poza zapytaniami? Algebra relacji. Bazy Danych i Systemy informacyjne Wykład 2.

Wykład 05 Bazy danych

Relacyjne bazy danych. Podstawy SQL

Bazy danych. Dr inż. Paweł Kasprowski

1. Połączenie z bazą danych. W wybranym edytorze tworzymy plik sqltest.py i umieszczamy w nim poniższy kod. #!/usr/bin/python3 import sqlite3

Ref. 7 - Język SQL - polecenia DDL i DML

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8

Wykład 5. SQL praca z tabelami 2

Bazy danych 5. Samozłaczenie SQL podstawy

Przykłady najlepiej wykonywać od razu na bazie i eksperymentować z nimi.

Programowanie obiektowe

Wzorce dystrybucji i wspólbieżności autonomicznej

Aby uruchomić program klienta i połączyć się z serwerem, należy komendę:

Bazy danych 4. SQL podstawy. P. F. Góra

NARZĘDZIA WIZUALIZACJI

MySQL. Darmowa baza danych. Æwiczenia praktyczne

Java Zadanie 1. Aby poprawnie uruchomić aplikację desktopową, należy zaimplementować główną metodę zapewniającą punkt wejścia do programu.

Język SQL. Rozdział 9. Język definiowania danych DDL, cześć 1. Tworzenie relacji, typy danych, wartości domyślne atrybutów, słownik bazy danych.

Relacyjne bazy danych. Podstawy SQL

Bazy danych dla producenta mebli tapicerowanych. Bartosz Janiak Marcin Sikora Wrocław r.

Odnawialne Źródła Energii I rok. Tutorial PostgreSQL

Systemy operacyjne na platformach mobilnych

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych

Przechowywanie danych

3 Przygotowali: mgr inż. Barbara Łukawska, mgr inż. Maciej Lasota

15. Funkcje i procedury składowane PL/SQL

PRZESTRZENNE BAZY DANYCH WYKŁAD 2

Systemy GIS Tworzenie zapytań w bazach danych

Dr Michał Tanaś(

Bazy danych. Polecenia SQL

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Wieloplatformowe aplikacje sieciowe. dr inż. Juliusz Mikoda mgr inż. Anna Wawszczak

Bloki anonimowe w PL/SQL

Programowanie w Ruby

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Paweł Rajba

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1

Podstawy języka SQL. SQL Structured Query Languagestrukturalny

DECLARE <nazwa_zmiennej> typ [(<rozmiar> )] [ NOT NULL ] [ { := DEFAULT } <wartość> ];

METODY PROGRAMOWANIA

Java: interfejsy i klasy wewnętrzne

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

SQL w praktyce. Miłej i owocnej nauki!!!

Jerzy Nawrocki, Wprowadzenie do informatyki

Intencje nadawcze. Aktywności mogą rozsyłać komunikaty do wszystkich zainstalowanych aplikacji

Wykład 4. SQL praca z tabelami 1

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Przykładowa baza danych BIBLIOTEKA

Programowanie MSQL. show databases; - pokazanie jakie bazy danych są dostępne na koncie

Hurtownia Świętego Mikołaja projekt bazy danych

Projektowanie systemów baz danych

Warsztaty Android, studenckie koło naukowe ISA 2

1. Sprawdzenie ustawień konfiguracyjnych. Uruchomienie wiersza poleceń:..\ścieżka\bin>mysqladmin variables

Projektowanie bazy danych. Jarosław Kuchta Projektowanie Aplikacji Internetowych

SQLite w systemie Android. Własny dostawca treści. Materiał teoretyczny

Paweł Cieśla. Dokumentacja projektu

Struktura bazy danych

Wprowadzenie do JDBC z wykorzystaniem bazy H2

Kowalski Marcin Wrocław, dn Jaśkiewicz Kamil Bazy Danych 1 Podstawy Projekt Temat: Baza danych do zarządzania projektami

akademia androida Service, BroadcastReceiver, ContentProvider część IV

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

ACESS- zadania z wykorzystaniem poleceń SQL

E.14 Bazy Danych cz. 18 SQL Funkcje, procedury składowane i wyzwalacze

Wykład 8. SQL praca z tabelami 5

Instytut Sterowania i Systemów Informatycznych Uniwersytet Zielonogórski. Zaawansowane Systemy Decyzyjne. Laboratorium

Aspekty aktywne baz danych

Bazy Danych i Usługi Sieciowe

Wykład 5 funkcje i procedury pamiętane widoki (perspektywy) wyzwalacze

Plan bazy: Kod zakładający bazę danych: DROP TABLE noclegi CASCADE; CREATE TABLE noclegi( id_noclegu SERIAL NOT NULL,

Przypomnienie o klasach i obiektach

Bazy danych 6. Klucze obce. P. F. Góra

PL/SQL. Zaawansowane tematy PL/SQL

Wykład 12. Programowanie serwera MS SQL 2005 w C#

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Programowanie w Ruby

Bazy danych 4. SQL- podstawy

SQL Server i T-SQL w mgnieniu oka : opanuj język zapytań w 10 minut dziennie / Ben Forta. Gliwice, Spis treści

WPROWADZENIE DO JĘZYKA SQL

SQL - DDL. 1 Tabele systemowe. 2 Typy danych

040 STRUCTURED QUERY LANGUAGE. Prof. dr hab. Marek Wisła

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Bartosz Jachnik - Kino

Wykład 5: PHP: praca z bazą danych MySQL

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Bazy danych i usługi sieciowe

CREATE DATABASE ksiegarnia_internetowa DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

P o d s t a w y j ę z y k a S Q L

Aplikacje bazodanowe. Laboratorium 1. Dawid Poªap Aplikacje bazodanowe - laboratorium 1 Luty, 22, / 37

Transkrypt:

Programowanie urządzeń mobilnych dr inż. Andrzej Grosser na podstawie wykładu dr inż. Juliusza Mikody

SharedPreferences Umożliwia przechowywanie małej ilości danych typów podstawowych Dane są przechowywane w postaci dostępnego pomiędzy sesjami aplikacji słownika. Używane przede wszystkim do zapamiętywania dostosowanych do preferencji użytkownika danych.

SharedPreferences Do uzyskiwana obiektu klasy SharedPreferences służą dwie metody: Activity.getPreferences(int mode) Context.getSharedPreferences(String nazwa, int mode) nazwa jest nazwą pliku Wartości z obiektu uzyskuje się za pomocą metod getxx() np.: getstring(string klucz, String wartdomyslna), getint(string klucz, int wartdomyslna).

SharedPreferences Zapisywanie danych jest wykonywane z wykorzystaniem metody SharedPreferences.edit() zwraca ona obiekt klasy SharedPreferences.Editor Wartości są zapisywane z wykorzystaniem metod klasy edytora np.: putint(string klucz, int wartość) remove(string klucz) Modyfikacje są zatwierdzane za pomocą metody commit()

Baza danych SQLite SQLite to system zarządzania bazą danych obsługujący język SQL (ang. Structured Query Language) Biblioteka implementuje silnik SQL, dając możliwość używania bazy danych bez konieczności uruchamiania osobnego procesu RDBMS. Bazy danych zapisywane są jako pliki binarne (jeden plik do 2TB). SQLite obsługuje między innymi: zapytania zagnieżdżone, widoki, klucze obce, transakcje, wyzwalacze (częściowo).

Baza danych SQLite Baza udostępnia kilka typów podstawowych: INTEGER (1 do 8 bajtów) INT, INTEGER, TINYINT, SMALLINT, MEDIUMINT, BIGINT, UNSIGNED BIG INT, INT2, INT8, TEXT typ tekstowy VARCHAR(255), CLOB, NONE typ nieokreślony BLOB, REAL typ zmienno przecinkowy REAL, DOUBLE, DOUBLE PRECISION, FLOAT, NUMERIC typ stałoprzecinkowy NUMERIC, DECIMAL(10,5), BOOLEAN, DATE, DATETIME.

Baza danych SQLite CREATE TABLE t1( t TEXT, nu NUMERIC, i INTEGER, r REAL, no BLOB ); INSERT INTO t1 VALUES('500.0', '500.0', '500.0', '500.0', '500.0'); SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1; text integer integer real text INSERT INTO t1 VALUES(500, 500, 500, 500, 500); SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1; text integer integer real integer

Tworzenie bazy danych Bazy danych projektu zapisywane są w katalogu: /data/data/*/databases/name.db Znak * zastępuje nazwa pakietu programu tworzącego bazę danych, Usuniecie pliku db powoduje usuniecie całej bazy danych, Bazę danych można utworzyć: bezpośrednio: Context.openOrCreateDatabase z użyciem klasy: SQLiteOpenHelper

Tworzenie bazy danych public class Pojazdy extends SQLiteOpenHelper { private static final int version = 1; public Pojazdy(Context context) { super(context, "pojazdy.db", null, version); public void oncreate(sqlitedatabase baza) { try{ baza.execsql("create TABLE IF NOT EXISTS Pojazdy " + "(marka VARCHAR, model VARCHAR)"); Log.v("Pojazdy", "Baza została utworzona"); catch(sqliteexception e) { Log.e("Pojazdy", "Błąd tworzenia lub otwarcia bazy danych"); public void onupgrade(sqlitedatabase baza, int ver1, int ver2) { Log.v("Pojazdy", "Zmiana wersji bazy " + ver1 + " " + ver2); baza.execsql("drop table Pojazdy"); oncreate(baza);

Zarządzanie bazą danych Tworzenie obiektu bazy danych: Pojazdy p = new Pojazdy(this); Otwarcie bazy danych do odczytu: SQLiteDatabase db = p.getreadabledatabase(); Otwarcie bazy danych do zapisu: SQLiteDatabase db = p.getwritabledatabase();

Zarządzanie bazą danych Pojazdy p = new Pojazdy(this); SQLiteDatabase db = p.getwritabledatabase(); // wstawianie z uwzględnieniem kolumn db.execsql("insert INTO Pojazdy (marka, model) " "VALUES('Toyota','Corolla');"); // kolejność pól bazy danych db.execsql("insert INTO Pojazdy VALUES('Fiat','Brava');"); // z użyciem parametrów db.execsql("insert INTO Pojazdy VALUES(?,?);", new String[]{"Karlik","20"); // Z użyciem zbioru wartości ContentValues cv = new ContentValues(); cv.put("marka", "Citroen"); cv.put("model", "C5"); db.insert("pojazdy", null, cv);

Zarządzanie bazą danych Odczyt danych z tabeli: Pojazdy p = new Pojazdy(this); SQLiteDatabase db = p.getreadabledatabase(); Cursor cursor = db.rawquery( "SELECT marka, model FROM Pojazdy", null); if(cursor.movetofirst()){ do { String marka = cursor.getstring( cursor.getcolumnindex("marka")); String model = cursor.getstring( cursor.getcolumnindex("model")); Log.i(marka, model); while(cursor.movetonext()); cursor.close(); db.close(); p.close();

Zarządzanie bazą danych Odczyt wartości z bazy danych: rawquery (String sql, String[] selectionargs) sql zapytanie, selectionargs dodatkowe argumenty (dla parametrów?) query (String table, String[] columns, String selection, String[] selectionargs, String groupby, String having, String orderby, String limit) Table nazwa tabeli, columns wybierane kolumny, selection wybór wartości, selectionargs dodatkowe argumenty, groupby elementy grupujące, having selekcja wartości grupowanych, orderby kolejność wyników, limit górny zakres liczby wierszy wyniku.

Konsola dostęp zewnętrzny android list avd lista dostępnych urządzeń adb devices uruchomione urządzenia adb shell dostęp do konsoli urządzenia ls R /data/data/*/databases sqlite3 /data/data/pl.pojazdy/databases/pojazdy.db.tables.schema.quit

Dostawcy treści Opakowują dane, które są dostarczane do aplikacji z wykorzystaniem interfejsu ContentResolver. Wymuszają odpowiednie uprawnienia do dostępu do danych. Dostawcy treści są wymagani w sytuacji, gdy dane mają być współdzielone pomiędzy różnymi aplikacjami.

ContentResolver Udostępnia interfejs podobny do bazodanowego np. query(), insert(), update() itp. Pozwala na korzystanie z dodatkowych serwisów, które pozwalają na powiadomienie zarejestrowanych obserwatorów o zmianie danych dostawcy treści. Podział na ContentResolver i ContenProvider pozwala na dostęp do danych w jednym procesie w innym procesie.

Standardowi dostawcy treści Browser dane przeglądarki internetowej, np. zakładki CallLog historia przeprowadzonych rozmów telefonicznych Contact (ContactsContract) dane kontaktowe (numery telefoniczne itd.) MediaStore dane multimedialne zdjęcia, filmy itd.

Budowa własnego dostawcy treści W celu utworzenia dostawcy treści należy rozszerzyć klasę android.content.contentprovider oraz zaimplementować metody: query pobieranie danych insert wprowadzanie informacji update zmiana danych delete usuwanie pozycji gettype zwraca MIME dla danego URI Następny przykład pochodzi z książki: Android 2 Tworzenie aplikacji Sayed Hashimi, Satya Komatineni, Dave MacLean

Przykład dostawca treści public class BookProviderMetaData { public static final String AUTHORITY = "pl.books.bookprovider"; public static final String DATABASE_NAME = "book.db"; public static final int DATABASE_VERSION = 1; public static final String BOOKS_TABLE_NAME = "books"; private BookProviderMetaData() { // wewnętrzna klasa opisująca obiekt BookTable // dzięki BaseColumns uzyskana jest kolumna _ID public static final class BookTableMetaData implements BaseColumns { private BookTableMetaData() { public static final String TABLE_NAME = "books"; // definicje identyfikatora URI oraz typu MIME public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/books");

Przykład dostawca treści public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.books"; public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.books"; public static final String DEFAULT_SORT_ORDER = "name DESC"; // Tu rozpoczynają się dodatkowe kolumny. // typ string public static final String BOOK_NAME = "name"; // typ string public static final String BOOK_ISBN = "isbn"; // typ string public static final String BOOK_AUTHOR = "author";

Przykład dostawca treści public class BookProvider extends ContentProvider { // Tworzy mapę projekcji kolumn. private static HashMap<String, String> sbooksprojectionmap; static { sbooksprojectionmap = new HashMap<String, String>(); sbooksprojectionmap.put(booktablemetadata._id, BookTableMetaData._ID); // kolumny name, isbn, author sbooksprojectionmap.put(booktablemetadata.book_name, BookTableMetaData.BOOK_NAME); sbooksprojectionmap.put(booktablemetadata.book_isbn, BookTableMetaData.BOOK_ISBN); sbooksprojectionmap.put(booktablemetadata.book_author, BookTableMetaData.BOOK_AUTHOR);

Przykład dostawca treści // Mechanizm umożliwiający identyfikowanie wzorców wszystkich // przychodzących identyfikatorów URI. private static final UriMatcher surimatcher; private static final int INCOMING_BOOK_COLLECTION_URI_INDICATOR = 1; private static final int INCOMING_SINGLE_BOOK_URI_INDICATOR = 2; static { surimatcher = new UriMatcher(UriMatcher.NO_MATCH); surimatcher.adduri(bookprovidermetadata.authority, "books", INCOMING_BOOK_COLLECTION_URI_INDICATOR); surimatcher.adduri(bookprovidermetadata.authority, "books/#", INCOMING_SINGLE_BOOK_URI_INDICATOR);

Przykład dostawca treści // Zajmuje się kwestią wywoływania zwrotnego metody OnCreate private DatabaseHelper mopenhelper; public boolean oncreate() { mopenhelper = new DatabaseHelper(getContext()); return true; private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, BookProviderMetaData.DATABASE_NAME, null, BookProviderMetaData.DATABASE_VERSION);

Przykład dostawca treści // Tworzy bazę danych public void oncreate(sqlitedatabase db) { db.execsql("create TABLE " + BookTableMetaData.TABLE_NAME + " (" + BookProviderMetaData.BookTableMetaData._ID + " INTEGER PRIMARY KEY," + BookTableMetaData.BOOK_NAME + " TEXT," + BookTableMetaData.BOOK_ISBN + " TEXT," + BookTableMetaData.BOOK_AUTHOR + " TEXT" + ");"); // Zajmuje się kwestią zmiany wersji public void onupgrade(sqlitedatabase db, int oldversion, int newversion) { Log.w("BookProvider", "Aktualizacja " + oldversion + " do wersji " + newversion); db.execsql("drop TABLE IF EXISTS " + BookTableMetaData.TABLE_NAME); oncreate(db);

Przykład dostawca treści @Override public String gettype(uri uri) { switch (surimatcher.match(uri)) { case INCOMING_BOOK_COLLECTION_URI_INDICATOR: return BookTableMetaData.CONTENT_TYPE; case INCOMING_SINGLE_BOOK_URI_INDICATOR: return BookTableMetaData.CONTENT_ITEM_TYPE; default: throw new IllegalArgumentException( "Nieznany ident. URI " + uri);

Przykład dostawca treści public Cursor query(uri uri, String[] projection, String selection, String[] selectionargs, String sortorder) { SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); qb.settables(booktablemetadata.table_name); qb.setprojectionmap(sbooksprojectionmap); switch (surimatcher.match(uri)) { case INCOMING_BOOK_COLLECTION_URI_INDICATOR: break; case INCOMING_SINGLE_BOOK_URI_INDICATOR: qb.appendwhere(booktablemetadata._id + "=" + uri.getpathsegments().get(1)); break; default: throw new IllegalArgumentException( "Nieznany ident. URI" + uri);

Przykład dostawca treści // Jeżeli kolejność sortowania nie jest określona, // należy skorzystać z domyślnej wartości String orderby; if (TextUtils.isEmpty(sortOrder)) { orderby = BookTableMetaData.DEFAULT_SORT_ORDER; else { orderby = sortorder; // Otwiera bazę danych i uruchamia kwerendę SQLiteDatabase db = mopenhelper.getreadabledatabase(); Cursor c = qb.query(db, projection, selection, selectionargs, null, null, orderby); // Mówi kursorowi, który identyfikator URI ma być // obserwowany na wypadek zmiany źródła danych. c.setnotificationuri( getcontext().getcontentresolver(), uri); return c;

Przykład dostawca treści @Override public Uri insert(uri uri, ContentValues values) { // Sprawdza żądany identyfikator Uri if (surimatcher.match(uri)!= INCOMING_BOOK_COLLECTION_URI_INDICATOR) { throw new IllegalArgumentException( "Nieznany ident. URI " + uri); if (values.containskey(booktablemetadata.book_name) == false) { throw new SQLException(" Nieudana próba wstawienia wiersza " + "z powodu braku nazwy książki " + uri); if (values.containskey(booktablemetadata.book_isbn) == false) { values.put(booktablemetadata.book_isbn, "Nieznany numer ISBN"); if (values.containskey(booktablemetadata.book_author) == false) { values.put(booktablemetadata.book_isbn, "Nieznany autor");

Przykład dostawca treści SQLiteDatabase db = mopenhelper.getwritabledatabase(); long rowid = db.insert(booktablemetadata.table_name, BookTableMetaData.BOOK_NAME, values); if (rowid > 0) { Uri insertedbookuri = ContentUris.withAppendedId( BookTableMetaData.CONTENT_URI, rowid); getcontext().getcontentresolver(). notifychange(insertedbookuri, null); return insertedbookuri; throw new SQLException( "Nieudana próba umieszczenia wiersza w " + uri);

Przykład dostawca treści public int update(uri uri, ContentValues values, String where, String[] whereargs){ SQLiteDatabase db = mopenhelper.getwritabledatabase(); int count; switch (surimatcher.match(uri)) { case INCOMING_BOOK_COLLECTION_URI_INDICATOR: count = db.update(booktablemetadata.table_name, values, where, whereargs); break; case INCOMING_SINGLE_BOOK_URI_INDICATOR: String rowid = uri.getpathsegments().get(1); count = db.update(booktablemetadata.table_name, Values, BookTableMetaData._ID + "=" + rowid + (!TextUtils.isEmpty(where)? " AND (" + where + ')' : ""), whereargs); break; default: throw new IllegalArgumentException( "Nieznany ident. URI " + uri); getcontext().getcontentresolver().notifychange(uri, null); return count;

Przykład dostawca treści public int delete(uri uri, String where, String[] whereargs) { SQLiteDatabase db = mopenhelper.getwritabledatabase(); int count; switch (surimatcher.match(uri)) { case INCOMING_BOOK_COLLECTION_URI_INDICATOR: count = db.delete(booktablemetadata.table_name, where, whereargs); break; case INCOMING_SINGLE_BOOK_URI_INDICATOR: String rowid = uri.getpathsegments().get(1); count = db.delete(booktablemetadata.table_name, BookTableMetaData._ID + "=" + rowid + (!TextUtils.isEmpty(where)? " AND (" + where + ')' : ""), whereargs); break; default: throw new IllegalArgumentException( "Nieznany ident. URI " + uri); getcontext().getcontentresolver().notifychange(uri, null); return count;