Programowanie aplikacji dla technologii mobilnych. Przygotowanie aplikacji. Tworzenie bazy danych i metod CRUD. Lab 5 SQLite, ListView II

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

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

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

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

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

Ciekawym rozwiązaniem służącym do obsługi zdarzeń dla kilku przycisków w ramach jednej aktywności może być następujący kod:

Systemy operacyjne na platformach mobilnych

Paweł Cieśla. Dokumentacja projektu

Platforma.NET laboratorium 4 Aktualizacja: 15/11/2013. Visual Basic.NET dostęp do bazy danych. Baza Microsoft SQL Server Compact

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

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

Fragmenty są wspierane od Androida 1.6

dr Artur Bartoszewski dr Artur Bartoszewski - Aplikacje mobilne - Wykład

Podstawy i języki programowania

Ćwiczenia 9 - Swing - część 1

MVC w praktyce tworzymy system artykułów. cz. 1

Podstawowe wykorzystanie Hibernate

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Język SQL, zajęcia nr 1

Ćwiczenie dotyczące platformy Java EE zostało przygotowane z myślą o środowisku NetBeans w wersji 7.3 (do pobrania z

Wykład 4: Klasy i Metody

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

Budowa aplikacji wielowarstwowych zastosowanie szablonów. Laboratorium 2 Programowanie komponentowe Zofia Kruczkiewicz

Oracle Application Express

Aktywności są związane z ekranem i definiują jego wygląd. Dzieje się to poprzez podpięcie do aktywności odpowiedniego widoku.

Projektowanie aplikacji w modelu MVC opartej o framework CodeIgniter

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

Klasy i obiekty cz II

akademia androida Intencje oraz URI część III

Laboratorium 7 Blog: dodawanie i edycja wpisów

Programowanie obiektowe

Baza danych sql. 1. Wprowadzenie

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

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

Klasy i obiekty cz I Klasy, obiekty, podstawy używania obiektów

Sprawdzenie czy połączenie przebiegło poprawnie if (mysqli_connect_errno()) { echo Błąd; Połączenie z bazą danych nie powiodło się.

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

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

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

Programowanie obiektowe

Zaawansowane aplikacje WWW - laboratorium

Typy metod: konstruktory, destruktory, selektory, zapytania, iteratory.

CREATE DATABASE ksiegarnia_internetowa DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Przychodnia 0. Stwórz projekt aplikacja konsolowa lub WPF (przemyśl wybór, bo zmiana może być czasochłonna). 1. Stwórz abstrakcyjną klasę Osoba.

E:\DYDAKTYKA\ZAI\ZWWW\Laboratoria\L07\Java Persistence.doc 2011-lis-24, 17:0 Zaawansowane aplikacje internetowe Laboratorium Java Persistence.

WTYCZKA FARA-TCM Dane techniczne dla twórców zewnętrznych aplikacji do obsługi map cmentarza

Projektowanie aplikacji internetowych laboratorium

[Android] Podstawy programowania

Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych

Aplikacje w środowisku Java

Programowanie w Ruby

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

8. Listy wartości, dodatkowe informacje dotyczące elementów i przycisków

Współbieżność w środowisku Java

Biuro Podróży 0. Stwórz projekt aplikacja konsolowa lub WPF (przemyśl wybór, bo zmiana może być czasochłonna). 1. Stwórz abstrakcyjną klasę

Podstawy obiektowości

Programowanie w Ruby

Programowanie obiektowe

Wprowadzenie do JDBC z wykorzystaniem bazy H2

Zaawansowane aplikacje internetowe - laboratorium Web Services (część 1).

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

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

Warsztaty Android, studenckie koło naukowe ISA 2

Instalacja MySQL.

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

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

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

Wprowadzenie db4o - podstawy db4o - technikalia Przydatne wiadomości. Wprowadzenie. db4o. Norbert Potocki. 1 czerwca Norbert Potocki db4o

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Dokumentacja SQL API 1

Struktura drzewa w MySQL. Michał Tyszczenko

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

Git, Bitbucket, IntelliJ IDEA

AKADEMIA MŁODYCH ODKRYWCÓW

PRZESTRZENNE BAZY DANYCH WYKŁAD 2

PHP: bazy danych, SQL, AJAX i JSON

Laboratorium 1 - Programowanie proceduralne i obiektowe

Programowanie w Ruby

PHP 5 język obiektowy

Życie aktywności Nawigując przez aplikacje poszczególne Aktywności przechodzą pomiędzy stanami. Dla przykładu gdy aktywność uruchamia się po raz

Metody dostępu do danych

Laboratorium 1. Wzorce oprogramowania lab1, Zofia Kruczkiewicz

PWSG Ćwiczenia 12. Wszystkie ukończone zadania należy wysłać na adres: lub

AndroidManifest.xml. Plik manifestu opisuje podstawowe charakterystyki aplikacji i definiuje jej komponenty.

Aplikacje WWW - laboratorium

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Dostęp do baz danych w ASP.NET.

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Wprowadzenie do Doctrine ORM

Budowa aplikacji ASP.NET współpracującej z bazą dany do obsługi przesyłania wiadomości

Biuro Podróży 0. Stwórz projekt aplikacja konsolowa lub WPF (przemyśl wybór, bo zmiana może być czasochłonna). 1. Stwórz abstrakcyjną klasę

Zaawansowane aplikacje internetowe - laboratorium

Wdrożenie modułu płatności eservice. dla systemu Zen Cart

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

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

Transkrypt:

Przygotowanie aplikacji 1. Uruchom projekt z lab4. Jeżeli go nie posiadasz na dysku lokalnym skorzystaj z repozytorium GitHub (File->New->Project from version control->github) 2. Zaktualizuj lokalny projekt z projektem na serwerze GitHub (VCS->Update Project) 3. Uruchom aplikację i sprawdź, czy działa poprawnie Opis aplikacji: Chcemy utworzyć aplikację, która przechowuje dane zobaczonych zwierząt. W tym celu zmodyfikujemy odpowiednio poprzednią aplikację: Lista będzie zawierać skomplikowaną strukturę danych Aplikacja będzie korzystać z bazy danych Tworzenie bazy danych i metod CRUD 1. Utwórz klasę o nazwie Animal (File- >new->javaclass) 2. Dodaj do klasy interfejs Serializable 3. Utwórz zmienne typu private przechowujące informacje o danym zwierzęciu a. _id (int) b. gatunek (String) c. kolor (String) d. wielkość (float) e. opis (String) 4. Utwórz pusty konstruktor danej klasy (zawsze musi być) 5. Utwórz konstruktor danej klasy, który przyjmie 4 parametry i uzupełni zmienne prywatne tworzonego obiektu 6. Przeciąż publiczną metodę zwracającą String o nazwie tostring() zwracając tekst, zawierający parametry zwierzęcia (bez opisu) 7. Dodaj getery (metody zwracające poszczególne pola obiektu) 8. Utwórz nową klasę MySQLite (file -> new -> javaclass) 9. Przy nazwie klasy dodaj jej rozszerzenie: public class MySQLite extends SQLiteOpenHelper { 10. Dodaj zmienną: Baza SQLite ma wiele ograniczeń w stosunku do innych popularnych baz wykorzystujących język zapytań SQL. Podstawowe konstrukcje języka SQL mają tą samą składnię. W SQLite mamy tylko 5 typów danych: Text (string w kodowaniu UTF) Integer (liczby całkowite) Real (liczby zmiennoprzecinkowe zapisane na 8 bajtach) Blob (zapis bitowy-zapisane tak, jak zostały wprowadzone) Null (pusty typ)

private static final int DATABASE_VERSION = 1; 11. Utwórz konstruktor danej klasy: public MySQLite(Context context) { super(context, "animalsdb", null, DATABASE_VERSION); 12. Przeciąż metodę oncreate i onupgrade: public void oncreate(sqlitedatabase database) { String DATABASE_CREATE = "create table animals " + "(_id integer primary key autoincrement," + "gatunek text not null," + "kolor text not null," + "wielkosc real not null," + "opis text not null);"; database.execsql(database_create); public void onupgrade(sqlitedatabase db, int oldversion, int newversion) { db.execsql("drop TABLE IF EXISTS animals"); oncreate(db); 13. Dodaj metodę dodającą nowy wpis do bazy danych: public void dodaj(animal zwierz){ this.getwritabledatabase(); ContentValues values = new ContentValues(); values.put("gatunek", zwierz.getgatunek()); values.put("kolor", zwierz.getkolor()); values.put("wielkosc", zwierz.getwielkosc()); values.put("opis", zwierz.getopis()); db.insert("animals", null, values); db.close(); 14. Dodaj metodę usuwającą wpis z bazy danych: public void usun(string id) { this.getwritabledatabase(); db.delete("animals", "_id =?", new String[] { id ); db.close(); 15. Dodaj metodę modyfikującą wpis w bazie danych: public int aktualizuj(animal zwierz) { this.getwritabledatabase(); Przy kopiowaniu kodów proszę zwrócić uwagę na podkreślnik przy _id (czasami go zjada, bądź jest niewidoczny) W metodzie oncreate tworzymy nową bazę danych SQLite o zadanej strukturze W metodzie onupgrade resetujemy bazę danych, np. gdy dodamy nowe pola do tabeli usunięcie starej i wszystkich danych jakie zawiera Aby dodać elementy do bazy danych należy: 1. Utworzyć obiekt SQLiteDatabase 2. Utworzyć obiekt ContentValues, który należy zapełnić strukturą zgodną z tabelą, do której wprowadzamy dane 3. Uruchomić metodę.insert() podając jako parametry tabelę do której dodajemy obiekt typu ContentValues Usuwanie wpisu z DB realizujemy metodą.delete() z parametrami takimi jak nazwa tabeli, warunek (który element ma być usunięty), i parametr warunku Aktualizacja przebiega podobnie jak dodawanie wpisu, z tym że wprowadzamy warunek (jaki element ma być modyfikowany) ContentValues values = new ContentValues(); values.put("gatunek", zwierz.getgatunek()); values.put("kolor", zwierz.getkolor()); values.put("wielkosc", zwierz.getwielkosc()); values.put("opis", zwierz.getopis()); int i = db.update("animals", values, "_id =

?", new String[]{String.valueOf(zwierz.getId())); db.close(); return i; 16. Dodaj metodę pobierającą wpis z bazy danych: public Animal pobierz(int id){ this.getreadabledatabase(); Cursor cursor = db.query("animals", //a. table name new String[] { "_id", "gatunek", "kolor", "wielkosc", "opis", // b. column names " id =?", // c. selections new String[] { String.valueOf(id), // d. selections args null, // e. group by null, // f. having null, // g. order by null); // h. limit Cursor jest obiektem typu iterator, który przechodzi po kolejnych elementach w bazie danych. Obiekt Cursor przyjmuje jako parametr nazwę tabeli, tabelę nazw poszczególnych pól (kolumn), warunki itp. Aby pobrać dane z wiersza na który wskazuje Cursor należy skorzystać z wbudowanych metod getstring, getfloat itp. (w zależności od typu danych) if (cursor!= null) cursor.movetofirst(); Animal zwierz = new Animal(cursor.getString(1), cursor.getstring(2), cursor.getfloat(3), cursor.getstring(4)); zwierz.setid(integer.parseint(cursor.getstring(0)) ); return zwierz; 17. Dodaj metodę zwracającą Cursor do bazy danych: public Cursor lista(){ this.getreadabledatabase(); return db.rawquery("select * from animals",null); Metoda Lista zwraca obiekt Cursora dla SimpleCursorAdapter, w danym przykładzie użyto pełnego zapytania SQL a nie wbudowanych funkcji 18. Wykonaj Commita wprowadzonych zmian Wyświetlanie wpisów 1. W pliku MainActivity.java należy zmienić rodzaj adaptera przypisanego do ListView z ArrayAdapter na SimpleCursorAdapter 2. Utwórz obiekt db utworzonej wcześniej klasy MySQLite 3. Następnie w metodzie oncreate zmieniamy sposób inicjalizacji adaptera: this.adapter = new SimpleCursorAdapter( this, android.r.layout.simple_list_item_2, db.lista(), new String[] {"_id", "gatunek", Adapter SimpleCursorAdapter pozwala na wyświetlanie elementów listy od dowolnego dostawcy danych. W niniejszym przykładzie wewnętrznej bazie danych SQLite Jako parametry podajemy Context (aktywne okno aplikacji) Wyświetlany typ (simple_list_item_2 oznacza, że dla kontrolki list item zostanie wyświetlony ciąg złożony z 2 zmiennych text1 i text2

new int[] {android.r.id.text1, android.r.id.text2, SimpleCursorAdapter.IGNORE_ITEM_VIEW_TYPE ); 4. Uruchom aplikację (powinien być pusty ekran, jako że baza danych jest pusta) 5. Wykonaj Commita Cursor którym adapter nawiguje po zbiorze danych Pola z bazy danych które będą wyświetlane Identyfikatory zmiennych do których będą zapisane pola od dostawcy treści Flaga adaptera Dodawanie wpisów 1. Zmodyfikuj formularz activity_dodaj_wpis wprowadzając dodatkowe pola opisujące zwierzę (takie jak w klasie Animal) 2. W pliku DodajWpis.java w metodzie oncreate utwórz ArrayAdapter zawierający listę dostępnych do wyboru gatunków i przypisz go do spinera ArrayAdapter gatunki = new ArrayAdapter( this, android.r.layout.simple_spinner_dropdown_item, new String[] {"Pies", "Kot", "Rybki"); Spinner gatunek = (Spinner) findviewbyid (R.id.gatunek); gatunek.setadapter(gatunki); 3. Zmodyfikuj metodę wyślij w DodajWpis.java Pobierz wartości poszczególnych pól Utwórz obiekt typu Animal Utwórz intencję i dodaj do niej dane Extra utworzony obiekt typu Animal Ustaw zwracanie danych z Activity Zakończ działanie danego Activity 4. Zmodyfikuj metodę onactivityresult w pliku MainActivity.java odpowiedzialną za odbiór danych z formularza zmieniając typ pobieranych danych: Animal nowy = (Animal) extras.getserializable("nowy"); Pole gatunek powinno być rozwijaną listą do wyboru Wielkość powinno być polem liczbowym Opis powinno mieć kilka linijek Aby dodać etykietę do pola użyj parametru android:hint (brak w spinerze) Tworząc adapter musimy podać jakim typem będzie zwracana wartość. Z bogatej kolekcji możliwości za pomocą autouzupełniania znajdujemy typ dedykowany spinerowi (simple_spinner_dropdown_item) public void wyslij (View view) { EditText kolor = (EditText) findviewbyid (R.id.kolor); EditText wielkosc = (EditText) findviewbyid (R.id.wielkosc); EditText opis = (EditText) findviewbyid (R.id.opis); Spinner gatunek = (Spinner) findviewbyid (R.id.gatunek); Animal zwierze = new Animal( gatunek.getselecteditem().tostring(), kolor.gettext().tostring(), Float.valueOf(wielkosc.getText().toString()), opis.gettext().tostring() ); Intent intencja = new Intent(); intencja.putextra("nowy", zwierze); setresult(result_ok, intencja); finish(); 5. Dodaj obiekt nowy do bazy danych: this.db.dodaj(nowy); 6. Zmień sposób odświeżania listy: adapter.changecursor(db.lista()); W odróżnieniu od programu z Lab4 dane przechowywane są w bazie danych. Dzięki

adapter.notifydatasetchanged(); 7. Przetestuj dodawanie wpisów do bazy danych 8. Wykonaj Commita temu wyłączenie aplikacji i jej ponowne uruchomienie nie traci wprowadzonych danych. Edycja wpisów 1. W pliku MainActivity.java w metodzie oncreate utwórz listner, który będzie reagować na naciśnięcie pojedynczego pola z listview: listview.setonitemclicklistener(new AdapterView.OnItemClickListener() { public void onitemclick(adapterview<?> adapter, View view,int pos, long id) { ); 2. Wewnątrz utworzonego listnera, w metodzie onitemclick pobierz wartość zmiennej id (zachowana w R.id.text1): TextView name = (TextView) view.findviewbyid(android.r.id.text1); 3. Utwórz obiekt typu Animal pobierając z bazy danych wartości danego wpisu: Animal zwierz = db.pobierz(integer.parseint (name.gettext().tostring())); Listner jest jedną z dwóch metod dodawania aktywności do przycisku/obiektu. Utworzenie listnera wymaga utworzenia obiektu z przeciążeniem wewnętrznej metody w zależności od rodzaju nasłuchiwanej akcji. onitemclick przyjmuje prócz adaptera wiersz, który został kliknięty, jego pozycję, oraz id (zgodny z tym w obiekcie R.id) Android wymaga częstej konwersji typu zmiennych. W tym przypadku dane musimy pobrać jako string a następnie przekonwertować do typu int 4. Stwórz intencję, dodaj nowoutworzony obiekt Animal jako Extra i uruchom formularz z innym kodem zwrotu: Intent intencja = new Intent(getApplicationContext(), DodajWpis.class); intencja.putextra("element", zwierz); startactivityforresult(intencja, 2); 5. W pliku DodajWpis.java utwórz prywatną zmienną modyfi_id 6. W metodzie oncreate po utworzeniu formularza stwórz obiekt Bundle, który odbierze dane Extra wysłane do aktywności 7. W bloku try{catch{ sprawdź czy istnieje przesłany obiekt, jeżeli nie ustaw modyfi_id na 0 8. Gdy istnieje przesłany obiekt pobierz dane extra jako obiekt typu Animal 9. Zmapuj pola formularza 10. Do każdego pola formularza przypisz wartość odpowiedniej zmiennej Bundle extras = getintent().getextras(); try { if(extras.getserializable( element )!= null) { Animal zwierz = (Animal) extras.getserializable( element ); EditText kolor = (EditText) findviewbyid(r.id.kolor); EditText 5ielkość = (EditText) findviewbyid(r.id.wielkosc); EditText opis = (EditText) findviewbyid(r.id.opis); kolor.settext(zwierz.getkolor()); 5ielkość.setText( Float.toString(zwierz.getWielkosc())); opis.settext(zwierz.getopis()); this.modyfi_id=zwierz.getid();

przesłanego obiektu 11. Ustaw modyfi_id na id przesłanego obiektu 12. W metodzie wyślij przed utworzeniem intencji dodaj przypisanie id do zwracanego obiektu: zwierze.setid(this.modyfi_id); 13. W pliku MainActivity.java do metody onactivityresult należy dodać obsługę powrotu z kodu 2 edycji, która wygląda dokładnie tak samo jak dodanie wpisu, z różnicą wywołania funkcji db.dodaj() na db.aktualizuj() 14. Sprawdź poprawność dodawania i edycji wpisów 15. Przeprowadź commit catch(exception ex) { this.modyfi_id=0; Jeżeli użytkownik modyfikuje obiekt, zwrócony przez formularz obiekt będzie posiadał niezerowy W przykładzie nie ustawiamy wartości Spinnera, gdyż wymaga znajomości pozycji a nie wartości wybranej opcji Usuwanie wpisów 1. W metodzie oncreate pliku MainActivity.java dodaj listner onitemlongclick: listview.setonitemlongclicklistener(new AdapterView.OnItemLongClickListener() { public boolean onitemlongclick(adapterview<?> parent, View view, int position, long id) { return true; ); 2. Pobierz id obiektu Animal klikniętego wpisu (tak jak w listnerze onitemclick) 3. Wywołaj metodę db.usun() 4. Zaktualizuj adapter (tak jak w metodzie onactivityresult 5. Sprawdź czy przytrzymanie wpisu na ListView go usuwa 6. Przeprowadź Commita oraz Push IDE AndroidStudio ułatwia tworzenie Listnerów. Korzystając z autouzupełniania przy ich tworzeniu powstaje cała struktura, a nie tylko nazwa. Pisząc aplikacje, każde usunięcie danych musi być dodatkowo potwierdzane przez użytkownika (dwuetapowo), szczególnie jeżeli dane są bezpowrotnie tracone