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

Wielkość: px
Rozpocząć pokaz od strony:

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

Transkrypt

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

2 Spis treści I. Wprowadzenie... 3 II. Tworzenie bazy danych... 5 III. Tworzenie dostawcy treści... 6 IV. Tworzenie aktywności wykorzystujących bazę danych i zaimplementowanego dostawcę treści V. Bibliografia

3 I. Wprowadzenie Aplikacje (nie tylko) mobilne często korzystają ze źródeł danych, które są ulokowane albo lokalnie w systemie, albo zdalnie na serwerach zewnętrznych. Udostępnianiem danych zawartych w wymienionych źródłach zajmują się dostawcy treści. Dostawcy treści są wykorzystywani do udostępniania danych na zewnątrz aplikacji lub do wymiany (współdzielenia) danych pomiędzy aplikacjami. Najbardziej pospolitym przykładem źródła danych umieszczonego w dostawcy treści jest baza danych SQLite ( opakowana przez dostawcę treści). Android (podobnie jak iphone OS czy Symbian) używa wbudowanej wersji sqlite3. Ta uproszczona wersja bazy oferuje częściową obsługę wyzwalaczy (triggers) i pozwala na generowanie większości złożonych zapytań (za wyjątkiem stosowania outer join; pozwala używać języka SQL w standardzie SQL92). Wyzwalacze to procedury wykonywane w odpowiedzi na zdarzenia takie jak np. dodanie czy usunięcie rekordu. Silnik bazodanowy SQLite po kompilacji zajmuje nie więcej niż 275 KB. Jest stosunkowo szybki (w porównaniu do popularnych baz danych opartych na modelu klient-serwer) oraz dostępny na wiele platform programowych. SQLite obsługuje bazy danych o wielkości rzędu terabajtów a kompletna baza przechowywana jest w pojedynczym pliku. Istnieją jednak pewne niedogodności związane z niepełnym wsparciem standardu SQL-92, które zostały przedstawione poniżej w postaci listy: Brak zaimplementowanego pola FOREIGN KEY (klucz obcy), czyli pola, którego wartość odpowiada kluczowi głównemu (PRIMARY KEY) w innej tabeli dla systemu Android poniżej wersji 2.2; Brak zaimplementowanych niektórych właściwości triggerów (wyzwalaczy) - w SQLite pominięte zostały takie właściwości triggerów jak: FOR EACH STATEMENT (wszystkie wyzwalacze muszą być FOR EACH ROW) i INSTEAD OF na tabelach (INSTEAD OF możliwy tylko na widokach) ; Brak niektórych wariantów polecenia ALTER TABLE - czyli polecenia zmieniającego właściwości istniejącej tabeli. W SQLite wspierane są tylko dwa warianty tego polecenia mianowicie zawierające atrybuty RENAME TABLE (zmiana nazwy tabeli) i ADD COLUMN (dodanie kolumny). Pozostałe rodzaje operacji ALTER TABLE, takie jak DROP COLUMN (usunięcie kolumny), czy ADD CONSTRAINT(dodanie ograniczenia) zostały pominięte; Brak obsługi transakcji zagnieżdżonych - w SQLite obecnie możliwe są tylko pojedyncze transakcje; Brak operacji łączenia prawostronnego (RIGHT OUTER JOIN) i pełnego (FULL OUTER JOIN) - w SQLite obecnie można używać łączenia lewostronnego LEFT OUTER JOIN; 3

4 Ograniczenia w operacjach na widokach - widoki (VIEWS) czyli wirtualne tabele w SQLite są tylko do odczytu (nie można wykonywać na nich DELETE, UPDATE i INSERT); Brak poleceń GRANT i REVOKE - komendy te służą do nadawania i odbierania uprawnień użytkownikom. SQLite zapisuje i odczytuje dane bezpośrednio z pliku, więc prawa dostępu nadawane są dla pliku z poziomu OS. Baza danych SQLite udostępnia kilka typów podstawowych wymienionych poniżej: 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. Bazy danych projektu aplikacji Android zapisywane są w katalogu: /DATA/data/NAZWA_APLIKACJI/databases/NAZWA_BAZY DATA jest ścieżką aplikacji, zwracaną po wywołaniu metody Environment.getDataDirectory(). NAZWA_APLIKACJI określa podaną w projekcie nazwę aplikacji. NAZWA_BAZY to nazwa pliku z rozszerzeniem.db, w którym znajduje się baza danych aplikacji. Pakiet android.database zawiera wszystkie klasy potrzebne do pracy z bazą danych, natomiast pakiet android.database.sqlite zawiera klasy specyficzne dla SQLite. Aby utworzyć lub zmodernizować bazą danych we własnej aplikacji Android, należy utworzyć podklasę klasy SQLiteOpenHelper. W konstruktorze utworzonej podklasy należy wywołać metodę super() dla klasy SQLiteOpenHelper, podając nazwę bazy danych i bieżącą jej wersję. W podklasie rozszerzającej SQLiteOpenHelper należy przesłonić następujące metody, tak aby istniała możliwość utworzenia i modernizacji bazy danych: oncreate() wywoływana przez framework, w przypadku gdy do bazy danych żądany jest dostęp a sama baza nie została jeszcze utworzona; onupgrade() wywoływana, jeżeli wersja bazy została inkrementowana w kodzie aplikacji. Metoda ta pozwala na aktualizację bazy lub jej usunięcie a następnie przywrócenie poprzez metodę oncreate(). Wymienione metody jako argument pobierają obiekt klasy SQLiteDatabase, będący reprezentacją bazy danych w Javie. Klasa SQLiteOpenHelper dostarcza metody 4

5 getreadabledatabase() i getwritabledatabase() służące do dostępu do obiektu klasy SQLiteDatabase odpowiednio w trybie odczytu i zapisu. Tabele bazy danych powinny używać identyfikatora _id jako klucza głównego (kilka funkcji Android bazuje na tym standardzie). Dodatkowo dobrą praktyką jest tworzenie oddzielnej klasy dla każdej z tabeli bazy danych. Klasa ta powinna mieć statyczne definicje metod oncreate() i onupgrade(), które są wywoływane jako odpowiednie metody podklasy SQLiteOpenHelper. W ten sposób implementacja podklasy SQLiteOpenHelper pozostaje czytelna, nawet w przypadku kilku tabel zawartych w bazie danych. W kolejnej części omówiono przykładową procedurę tworzenia bazy danych oraz implementacji podklasy SQLiteOpenHelper. II. Tworzenie bazy danych Pierwszym krokiem w omawianej procedurze tworzenia i obsługi bazy danych jest implementacja klasy odzwierciedlającej tabelę w bazie danych. W prezentowanym przykładzie utworzona została aplikacja zarządzająca listą rzeczy do zrobienia, na podstawie [6]. Aplikacja składa się z dwóch aktywności: jednej widocznej jako lista wszystkich rzeczy do zrobienia, druga widoczna jako ekran edycji lub tworzenia nowego elementu listy. Obie aktywności komunikują się za pomocą intencji. Do asynchronicznej pracy z bazą danych wykorzystano idee kursora zawartości (klasa Cursor) oraz klasę Loader służącą do asynchronicznej pracy z bazą danych. Poniżej zaprezentowano implementację klasy TabelaNotatki, odzwierciedlającej tabelę w bazie danych aplikacji. public class TabelaNotatki { public static final String TABLE_NOTATKI = "notatki"; public static final String COLUMN_ID = "_id"; public static final String COLUMN_CATEGORY = "kategoria"; public static final String COLUMN_SUMMARY = "streszczenie"; public static final String COLUMN_DESCRIPTION = "opis"; // wyrażenie opisujące tworzenie bazy danych private static final String DATABASE_CREATE = "create table " + TABLE_NOTATKI + "(" + COLUMN_ID + " integer primary key autoincrement, " + COLUMN_CATEGORY + " text not null, " + COLUMN_SUMMARY + " text not null," + COLUMN_DESCRIPTION + " text not null" + ");"; public static void oncreate(sqlitedatabase database) { database.execsql(database_create); public static void onupgrade(sqlitedatabase database, int oldversion, int newversion) { Log.w(TabelaNotatki.class.getName(), "Aktualizuję bazę z wersji " + oldversion + " do wersji " + newversion + ", co spowoduje usunięcie wszystkich danych."); 5

6 database.execsql("drop TABLE IF EXISTS " + TABLE_NOTATKI); oncreate(database); W klasie TabelaNotatki zdefiniowano publiczne statyczne pola opisujące tabelę notatki. Następnie utworzona została klasa NotatkiDatabaseHelper będąca podklasą SQLiteOpenHelper. Klasa NotatkiDatabaseHelper zawiera wywołania statycznych metod klasy TabelaNotatki. Implementacja tej podklasy została przedstawiona poniżej. public class NotatkiDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "todotable.db"; private static final int DATABASE_VERSION = 1; public NotatkiDatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); // metoda wywoływana podczas tworzenia bazy public void oncreate(sqlitedatabase database) { TabelaNotatki.onCreate(database); //metoda wywoływana podczas modernizacji bazy public void onupgrade(sqlitedatabase database, int oldversion, int newversion) { TabelaNotatki.onUpgrade(database, oldversion, newversion); Jak widać na powyższym kodzie klasy, plik bazy danych nosi nazwę todotable.db. Konstruktor klasy wywołuje w swoim ciele konstruktor nadklasy ( super ), który pobiera jako parametry: kontekst, nazwę pliku bazy danych, referencję do obiektu fabryki kursorów treści (domyślna wartość: null) oraz numer wersji bazy danych. W ciałach metod oncreate oraz onupgrade znajdują się wywołania odpowiednich statycznych metod klasy TabelaNotatki, związanych z tworzeniem oraz modernizacją bazy danych. W kolejnych krokach dokonano implementacji dostawy treści oraz aktywności wykorzystujących utworzoną bazę i dostawcę treści. III. Tworzenie dostawcy treści Baza danych SQLite jest przeznaczona do użytku prywatnego dla aplikacji, która ją stworzyła. Aby udostępnić dane zawarte w tej bazie innym aplikacjom, można wykorzystać dostawcę treści. Chociaż dostawca treści może być użyty wewnątrz aplikacji do dostępu do danych, to jego głównym 6

7 celem jest współdzielenie danych z innymi aplikacjami. Dostawca treści przed wykorzystaniem musi zostać zadeklarowany w deskryptorze aplikacji. Dostęp do dostawcy treści odbywa się za pośrednictwem identyfikatora URI, który jednoznacznie określa dostawcę. Struktura tego identyfikatora przypomina identyfikator URI protokołu HTTP. Ogólna struktura identyfikatora URI przedstawia się następująco: content://authority-name/path-segment/ content jest elementem określającym dostawcę treści, authority-name jest niepowtarzalnym identyfikatorem upoważnienia używanym do zlokalizowania dostawcy w rejestrze dostawców, path-segment to człon określający ścieżkę dostępu do danych (inną dla każdego dostawcy); człon ten może być powtarzany wielokrotnie. Przykład poniżej przedstawia wywołanie listy kontaktów z podaniem identyfikatora jednego kontaktu: content://com.android.contacts/contacts/lookup/0n293f33292b314f /2 Dla dostawców wbudowanych (com.android) nie trzeba używać całego identyfkator, wystarczy wskazać odpowiednie słowo: content://contacts/contacts/1. W dalszej części omówiono przykład implementacji własnego dostawcy treści, który wykorzystuje zdefiniowaną wcześniej bazę danych. Aby utworzyć własnego dostawcę treści należy utworzyć klasę, która rozszerza klasę android.content.contentprovider. Dodatkowo w pliku AndroidManifest.xml aplikacji należy zadeklarować utworzonego dostawcę treści, tak by był dostępny w rejestrze dostawców. Wpis w pliku deskryptora aplikacji, rejestrujący dostawcę, określa nazwę dostawcy (parametr android:name) oraz identyfikator (parametr android:authorities). Tworzony dostawca treści musi również implementować kilka metod, np. query(), insert(), update(), delete(), gettype() oraz oncreate(). W przypadku braku obsługi określonych metod, dobrą praktyką jest wywołanie wyjątku klasy UnsupportedOperationException(). Dodatkowo metoda query() musi zwracać obiekt klasy Cursor. Poniżej zaprezentowany został pierwszy fragment implementacji klasy MyContentProvider, będącej dostawcą treści, który obsługuje utworzoną wcześniej bazę danych. public class MyContentProvider extends ContentProvider { // baza danych private NotatkiDatabaseHelper database; // pola wykorzystane przez obiekt klasy UriMatcher private static final int TODOS = 10; private static final int TODO_ID = 20; 7

8 private static final String AUTHORITY = "com.example.mk3_ap4.contentprovider"; private static final String BASE_PATH = "todos"; public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH); public static final String CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/todos"; public static final String CONTENT_ITEM_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE + "/todo"; // utworzenie obiektu urimatchera private static final UriMatcher surimatcher = new UriMatcher(UriMatcher.NO_MATCH); static { surimatcher.adduri(authority, BASE_PATH, TODOS); surimatcher.adduri(authority, BASE_PATH + "/#", TODO_ID); W przedstawionym powyżej fragmencie kodu zadeklarowano obiekt klasy NotatkiDatabaseHelper, który jest łącznikiem pomiędzy dostawcą treści a silnikiem bazy danych aplikacji. Za jego pomocą w dalszych implementacjach metod dostawcy treści odbywać się będzie aktualizacja danych w bazie danych. Dodatkowo zainicjowano stałe wykorzystywane przez obiekt UriMatcher, który wykorzystywany jest w dalszych metodach tej klasy do sprawdzania ścieżek Uri modyfikowanych przez dostawcę treści wartości. W końcowej części przedstawionego fragmentu utworzono obiekt klasy UriMatcher, przechowujący odpowiednie identyfikatory, ścieżkę do bazy danych oraz wartość przechowywaną w rejestrze dostawców treści (zdefiniowaną później w pliku deskryptora aplikacji). Następnie zaimplementowano kolejne metody dostawcy treści przedstawione w dalszej kolejności. public boolean oncreate() { database = new NotatkiDatabaseHelper(getContext()); return false; W metodzie oncreate tworzony jest nowy obiekt bazy danych za pomocą konstruktora klasy NotatkiDatabaseHelper. Kolejną zaimplementowaną metodą dostawcy treści jest metoda query, której ciało przedstawiono poniżej. public Cursor query(uri uri, String[] projection, String selection, String[] selectionargs, String sortorder) { 8

9 // obiekt budujący zapytanie SQLiteQueryBuilder querybuilder = new SQLiteQueryBuilder(); // sprawdza czy rozmówca wysłał żądanie o kolumny, które nie istnieją checkcolumns(projection); // ustawienie tabeli querybuilder.settables(tabelanotatki.table_notatki); int uritype = surimatcher.match(uri); switch (uritype) { case TODOS: break; case TODO_ID: // dodanie ID do oryginalnej ścieżki querybuilder.appendwhere(tabelanotatki.column_id + "=" + uri.getlastpathsegment()); break; default: throw new IllegalArgumentException("Unknown URI: " + uri); SQLiteDatabase db = database.getwritabledatabase(); Cursor cursor = querybuilder.query(db, projection, selection, selectionargs, null, null, sortorder); // upewnienie się, że potencjalni słuchacze zostali poinformowani cursor.setnotificationuri(getcontext().getcontentresolver(), uri); return cursor; Metoda query służy do obsługi zapytań pochodzących od klientów i może być wywoływana z różnych wątków. Do budowy zapytania wykorzystany został mechanizm oferowany przez klasę SQLiteQueryBuilder. Metoda pobiera parametry w postaci: adresu URI zapytania (Uri uri), listy kolumn, które mają być przekazane do obiektu kursora treści (String[] projection), kryterium selekcji wierszy tabeli (String selection), lity argumentów kryterium selekcji wierszy (String[] selectionargs) oraz porządek sortowania (String sortorder). Metoda query zwraca obiekt klasy Cursor, który pozwala nawigować pomiędzy wynikami zapytania do bazy danych. public String gettype(uri uri) { return null; Metoda obsługująca zwracanie różnych typów MIME dla danego adresu URI. Jej implementacja jest wymagana, jednak w tym przypadku nie istnieje potrzeba implementacji obsługi zwracania typów elementów. W takim wypadku metoda zwraca wartość null. 9

10 public Uri insert(uri uri, ContentValues values) { int uritype = surimatcher.match(uri); SQLiteDatabase sqldb = database.getwritabledatabase(); long id = 0; switch (uritype) { case TODOS: id = sqldb.insert(tabelanotatki.table_notatki, null, values); break; default: throw new IllegalArgumentException("Unknown URI: " + uri); getcontext().getcontentresolver().notifychange(uri, null); return Uri.parse(BASE_PATH + "/" + id); Kolejną zaimplementowaną metodą dostawy treści jest metoda insert, która służy do dodawania nowego elementu określonego URI do bazy danych za pomocą obiektu klasy ContentValues. W wyniku metoda ta zwraca adres URI wstawionego elementu. public int delete(uri uri, String selection, String[] selectionargs) { int uritype = surimatcher.match(uri); SQLiteDatabase sqldb = database.getwritabledatabase(); int rowsdeleted = 0; switch (uritype) { case TODOS: rowsdeleted = sqldb.delete(tabelanotatki.table_notatki, selection, selectionargs); break; case TODO_ID: String id = uri.getlastpathsegment(); if (TextUtils.isEmpty(selection)) { rowsdeleted = sqldb.delete(tabelanotatki.table_notatki, TabelaNotatki.COLUMN_ID + "=" + id, null); else { rowsdeleted = sqldb.delete(tabelanotatki.table_notatki, TabelaNotatki.COLUMN_ID + "=" + id + " and " + selection, selectionargs); break; default: throw new IllegalArgumentException("Unknown URI: " + uri); getcontext().getcontentresolver().notifychange(uri, null); return rowsdeleted; Następnie zaimplementowana została metoda delete, służąca do usuwania wybranego elementu (lub elementów) z bazy. Metoda pobiera parametry w postaci: adresu URI zapytania, 10

11 kryterium wyboru elementów oraz listy argumentów kryterium wyboru. Po przekazaniu sterowania do głównej pętli programu zwracana jest liczba usuniętych wierszy. public int update(uri uri, ContentValues values, String selection, String[] selectionargs) { int uritype = surimatcher.match(uri); SQLiteDatabase sqldb = database.getwritabledatabase(); int rowsupdated = 0; switch (uritype) { case TODOS: rowsupdated = sqldb.update(tabelanotatki.table_notatki, values, selection, selectionargs); break; case TODO_ID: String id = uri.getlastpathsegment(); if (TextUtils.isEmpty(selection)) { rowsupdated = sqldb.update(tabelanotatki.table_notatki, values, TabelaNotatki.COLUMN_ID + "=" + id, null); else { rowsupdated = sqldb.update(tabelanotatki.table_notatki, values, TabelaNotatki.COLUMN_ID + "=" + id + " and " + selection, selectionargs); break; default: throw new IllegalArgumentException("Unknown URI: " + uri); getcontext().getcontentresolver().notifychange(uri, null); return rowsupdated; Następnie zaimplementowano metodę update odpowiedzialną za aktualizację danych w bazie. Metoda pobiera parametry w postaci: pełnego adresu URI zapytania, kolekcji wartości do aktualizacji przekazaną w postaci obiektu klasy ContentValues, kryterium wyboru wierszy do aktualizacji wartości oraz listy argumentów tego kryterium. Metoda zwraca liczbę zaktualizowanych wierszy tabeli. private void checkcolumns(string[] projection) { String[] available = { TabelaNotatki.COLUMN_CATEGORY, TabelaNotatki.COLUMN_SUMMARY, TabelaNotatki.COLUMN_DESCRIPTION, TabelaNotatki.COLUMN_ID ; if (projection!= null) { 11

12 HashSet<String> requestedcolumns = new HashSet<String>(Arrays.asList(projection)); HashSet<String> availablecolumns = new HashSet<String>(Arrays.asList(available)); // Sprawdzenie czy wszystkie kolumny, które są wymagane, są dostępne if (!availablecolumns.containsall(requestedcolumns)) { throw new IllegalArgumentException("Unknown columns in projection"); Ostatnią metodą zaimplementowaną w dostawcy treści jest metoda checkcolumns, wykorzystywana w metodzie query do sprawdzenia poprawności żądania klienta odnośnie kolumn, które mają zostać przekazane do obiektu kursora (klasa Cursor). Dostawca treści, aby mógł być wykorzystany, musi zostać zarejestrowany w manifeście aplikacji. Dla zaimplementowanego wcześniej dostawcy fragment odpowiedzialny za jego rejestrację w pliku AndroidManifest.xml przedstawiono poniżej. <provider android:name="com.example.mk3_ap4.mycontentprovider" android:authorities="com.example.mk3_ap4.contentprovider" > </provider> W kolejnym rozdziale przedstawiono implementację aktywności oraz układu graficznego aplikacji wykorzystującej utworzonego dostawcę treści oraz bazę danych notatek. IV. Tworzenie aktywności wykorzystujących bazę danych i zaimplementowanego dostawcę treści Zanim przedstawiona zostanie implementacja aktywności aplikacji, pokazane zostaną definicje wykorzystywanych przez nie zasobów. Poniżej przedstawiono definicję menu dostępnego w pasku akcji (ActionBar) w postaci napisu Dodaj, zdefiniowanego w pliku strings.xml. Za wyświetlenie elementu menu na pasku zadań odpowiedzialny jest argument android:showasaction= always. Definicja pliku menu znajduje się w katalogu /res/menu. <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android=" > <item android:id="@+id/insert" android:showasaction="always" android:title="@string/insert"> </item> 12

13 </menu> Następnie w katalogu /res/values zdefiniowano tablicę napisów opisujących priorytety dodawanych do listy elementów. Lista składa się z dwóch elementów, których napisy zdefiniowano w pliku strings.xml. <?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="priorities"> <item>@string/urgent</item> <item>@string/reminder</item> </string-array> </resources> Wygląd pliku strings.xml został przedstawiony poniżej. Znajdują się w nim wszystkie napisy wykorzystywane podczas funkcjonowania aktywności. <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">mk3_ap4</string> <string name="action_settings">ustawienia</string> <string name="insert">dodaj</string> <string name="urgent">pilne</string> <string name="reminder">przypomnienie</string> <string name="no_todos">brak rzeczy do zrobienia</string> <string name="menu_insert">dodaj element</string> <string name="menu_delete">usuń element</string> <string name="todo_summary">streszczenie</string> <string name="todo_description">usuń wpis</string> <string name="todo_edit_summary">streszczenie</string> <string name="todo_edit_description">opis</string> <string name="todo_edit_confirm">zatwierdź</string> <string name="title_activity_edit">editactivity</string> <string name="hello_world">hello world!</string> </resources> Z kolei na kolejnym fragmencie kodu przedstawiono definicję XML układu graficznego pojedynczego wiersza listy elementów, składającego się z kontrolki TextView. Plik z definicją wiersza znajduje się w katalogu /res/layout. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/label" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margintop="6dp" android:lines="1" android:text="@+id/textview01" android:textsize="24sp" > 13

14 </TextView> </LinearLayout> Poniżej z kolej przedstawiono definicję układu graficznego listy notatek, w którym znajduje się kontrolka ListView oraz TextView, wyświetlająca odpowiedni napis w przypadku pustej listy elementów. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> <TextView android:id="@android:id/empty" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/no_todos" /> </LinearLayout> Kolejny fragment przedstawia definicję układu graficznego ekranu edycji/dodawania/aktualizacji elementu listy. Układ ten powiązany jest z aktywnością, do której przekazywane jest sterowanie z głównej aktywności aplikacji. W interfejsie zdefiniowano kontrolkę Spinner (do wyboru priorytetu notatki), pola EditText oraz kontrolkę Button. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Spinner android:id="@+id/category" android:layout_width="wrap_content" android:layout_height="wrap_content" android:entries="@array/priorities" > </Spinner> <LinearLayout android:id="@+id/linearlayout01" android:layout_width="match_parent" android:layout_height="wrap_content" > <EditText android:id="@+id/todo_edit_summary" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" 14

15 android:imeoptions="actionnext" > </EditText> </LinearLayout> <EditText android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:gravity="top" android:imeoptions="actionnext" > </EditText> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" > </Button> </LinearLayout> Implementacja głównej aktywności została przedstawiona poniżej. Do obsługi kontrolki ListView wykorzystany został adapter klasy SimpleCursorAdapter. Aktywność główna rozszerza klasę ListActivity oraz implementuje interfejs LoaderManager.LoaderCallbacks do asynchronicznej obsługi kursorów treści. Mechanizm ten zabezpiecza aplikację przez zawieszeniem w przypadku długiego oczekiwania na wynik z bazy danych lub błędu zapytania. public class MainActivity extends ListActivity implements LoaderManager.LoaderCallbacks<Cursor> { private static final int ACTIVITY_CREATE = 0; private static final int ACTIVITY_EDIT = 1; private static final int DELETE_ID = Menu.FIRST + 1; private SimpleCursorAdapter adapter; public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.notatki_list); this.getlistview().setdividerheight(2); filldata(); registerforcontextmenu(getlistview()); // Tworzenie menu bazującego na definicji w pliku XML public boolean oncreateoptionsmenu(menu menu) { MenuInflater inflater = getmenuinflater(); inflater.inflate(r.menu.listmenu, menu); return true; 15

16 // Reakacja na wybór elementu menu public boolean onoptionsitemselected(menuitem item) { switch (item.getitemid()) { case R.id.insert: createtodo(); return true; return super.onoptionsitemselected(item); public boolean oncontextitemselected(menuitem item) { switch (item.getitemid()) { case DELETE_ID: AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getmenuinfo(); Uri uri = Uri.parse(MyContentProvider.CONTENT_URI + "/" + info.id); getcontentresolver().delete(uri, null, null); filldata(); return true; return super.oncontextitemselected(item); private void createtodo() { Intent i = new Intent(this, EditActivity.class); startactivity(i); { // Wywołanie drugiej aktywności po kliknięciu na element listy protected void onlistitemclick(listview l, View v, int position, long id) super.onlistitemclick(l, v, position, id); Intent i = new Intent(this, EditActivity.class); Uri todouri = Uri.parse(MyContentProvider.CONTENT_URI + "/" + id); i.putextra(mycontentprovider.content_item_type, todouri); startactivity(i); private void filldata() { // Pola z bazy danych (projekcja) // Zmienna musi zawierać identyfikatory (_id) kolumn aby adapter działała prawidłowo String[] from = new String[] { TabelaNotatki.COLUMN_SUMMARY ; // Pola interfejsu do zmapowania z adapterem int[] to = new int[] { R.id.label ; from, getloadermanager().initloader(0, null, this); adapter = new SimpleCursorAdapter(this, R.layout.notatki_row, null, to, 0); 16

17 setlistadapter(adapter); public void oncreatecontextmenu(contextmenu menu, View v, ContextMenuInfo menuinfo) { super.oncreatecontextmenu(menu, v, menuinfo); menu.add(0, DELETE_ID, 0, R.string.menu_delete); // Tworzenie nowego loadera po wywołaniu metody initloader() public Loader<Cursor> oncreateloader(int id, Bundle args) { String[] projection = { TabelaNotatki.COLUMN_ID, TabelaNotatki.COLUMN_SUMMARY ; CursorLoader cursorloader = new CursorLoader(this, MyContentProvider.CONTENT_URI, projection, null, null, null); return cursorloader; public void onloadfinished(loader<cursor> loader, Cursor data) { adapter.swapcursor(data); public void onloaderreset(loader<cursor> loader) { // dane nie są już dostępne, usunięcie referencji adapter.swapcursor(null); Implementacja aktywności edycji elementu została przedstawiona poniżej. Komunikacja pomiędzy aktywnością główną (MainActivity) a przedstawioną poniżej odbywa się za pomocą obiektu Intent, w którym następuje przekazanie wartości pojedynczego elementu listy notatek. public class EditActivity extends Activity { private Spinner mcategory; private EditText mtitletext; private EditText mbodytext; private Uri todouri; protected void oncreate(bundle bundle) { super.oncreate(bundle); setcontentview(r.layout.activity_edit); mcategory = (Spinner) findviewbyid(r.id.category); mtitletext = (EditText) findviewbyid(r.id.todo_edit_summary); mbodytext = (EditText) findviewbyid(r.id.todo_edit_description); Button confirmbutton = (Button) findviewbyid(r.id.todo_edit_button); Bundle extras = getintent().getextras(); 17

18 // sprawdzenie danych z zapisanej instancji todouri = (bundle == null)? null : (Uri) bundle.getparcelable(mycontentprovider.content_item_type); // lub przekazanych przez inną aktywność if (extras!= null) { todouri = extras.getparcelable(mycontentprovider.content_item_type); filldata(todouri); confirmbutton.setonclicklistener(new View.OnClickListener() { public void onclick(view view) { if (TextUtils.isEmpty(mTitleText.getText().toString())) { maketoast(); else { setresult(result_ok); finish(); ); private void filldata(uri uri) { String[] projection = { TabelaNotatki.COLUMN_SUMMARY, TabelaNotatki.COLUMN_DESCRIPTION, TabelaNotatki.COLUMN_CATEGORY ; Cursor cursor = getcontentresolver().query(uri, projection, null, null, null); if (cursor!= null) { cursor.movetofirst(); String category = cursor.getstring(cursor.getcolumnindexorthrow(tabelanotatki.column_category)); for (int i = 0; i < mcategory.getcount(); i++) { String s = (String) mcategory.getitematposition(i); if (s.equalsignorecase(category)) { mcategory.setselection(i); mtitletext.settext(cursor.getstring(cursor.getcolumnindexorthrow(tabelanotatki.column_summary))); mbodytext.settext(cursor.getstring(cursor.getcolumnindexorthrow(tabelanotatki.column_description))); // zamknięcie kursora cursor.close(); protected void onsaveinstancestate(bundle outstate) { super.onsaveinstancestate(outstate); savestate(); outstate.putparcelable(mycontentprovider.content_item_type, todouri); 18

19 values); protected void onpause() { super.onpause(); savestate(); private void savestate() { String category = (String) mcategory.getselecteditem(); String summary = mtitletext.gettext().tostring(); String description = mbodytext.gettext().tostring(); // Zapisanie tylko gdy pole summary i descriptions są wypełnione if (description.length() == 0 && summary.length() == 0) { return; ContentValues values = new ContentValues(); values.put(tabelanotatki.column_category, category); values.put(tabelanotatki.column_summary, summary); values.put(tabelanotatki.column_description, description); if (todouri == null) { // Nowy element todouri = getcontentresolver().insert(mycontentprovider.content_uri, else { // Aktualizacja elementu getcontentresolver().update(todouri, values, null, null); private void maketoast() { Toast.makeText(EditActivity.this, "Proszę wprowadzić streszczenie", Toast.LENGTH_LONG).show(); Na rys. 1 przedstawiono ekran aplikacji z pustą listą notatek. U góry po prawej na pasku ActionBar znajduje się napis Dodaj. Jego kliknięcie powoduje wywołanie aktywności dodawania elementu. 19

20 Rys. 1 Uruchomienie programu Rys. 2 przedstawia ekran dodawania/edycji elementu listy w postaci notatki o podanym priorytecie (kontrolka Spinner). Odpowiednie wypełnienie poszczególnych pól ekranu i kliknięcie w przycisk Zatwierdź powoduje dodanie/aktualizację notatki. 20

21 Rys. 2 Ekran edycji Na rys. 3 przedstawiony został ekran aplikacji w przypadku próby usunięcie zaznaczonego na liście elementu (notatki). Przyciśnięcie napisu Usuń element powoduje usunięcie notatki z listy. 21

22 Rys. 3 Usuwanie elementu Przedstawiony tu przykład implementacyjny ma na celu wprowadzenie odbiorcę w problematykę tworzenia adapterów baz danych oraz własnych dostawców treści w środowisku aplikacji Android. Treści przekazane w ramach tej pracy są jednie wstępem do dalszego poszukiwania informacji na ten temat w literaturze fachowej. V. Bibliografia 1. Arsoba, R. (2011). Programowanie urządzeń mobilnych. Zagadnienia podstawowe. Pobrano Czerwiec 12, 2012 z lokalizacji 2. Conder S., D. L. (2011). Android. Programowanie aplikacji na urządzenia przenośne. Wydanie II. Gliwice: Helion. 3. Geetha, S. (2011, Maj 17). Sai Geetha's Blog - Android. Pobrano Czerwiec 20, 2013 z lokalizacji Sai Geetha's Blog: 4. Komatineni S., M. D. (2012). Android 3. Tworzenie aplikacji. Gliwice: Helion. 22

23 5. Lee, W.-M. (2011). Beginning Android Application Development. Indianapolis: Wiley Publishing Inc. 6. Vogel, L. (2013, sierpień 19). Android SQL database and content provider - tutorial. Pobrano z lokalizacji 23

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

Programowanie urządzeń mobilnych. dr inż. Andrzej Grosser na podstawie wykładu dr inż. Juliusza Mikody 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

Bardziej szczegółowo

Systemy operacyjne na platformach mobilnych

Systemy operacyjne na platformach mobilnych Systemy operacyjne na platformach mobilnych Wykład 3 Grzegorz Jabłoński, Piotr Perek Katedra Mikroelektroniki i Technik Informatycznych Zagadnienia wykładu Menu opcji ListActivity własny widok własny adapter

Bardziej szczegółowo

akademia androida Składowanie danych część VI

akademia androida Składowanie danych część VI akademia androida Składowanie danych część VI agenda 1. SharedPreferences. 2. Pamięć wewnętrzna i karta SD. 3. Pliki w katalogach /res/raw i /res/xml. 4. Baza danych SQLite. 5. Zadanie. 1. SharedPreferences.

Bardziej szczegółowo

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

Programowanie w języku Java. Bazy danych SQLite w Javie Programowanie w języku Java Bazy danych SQLite w Javie Co to jest SQLite SQLite to bezserwerowa, nie wymagająca konfiguracji relacyjna baza danych. Znajduje szerokie zastosowanie np.. w systemie android

Bardziej szczegółowo

[Android] Podstawy programowania

[Android] Podstawy programowania Page 1 of 7 [Android] Podstawy programowania LinkiPrzewodnik z przykładamizasosbykrótka prezentacja wprowadzająca do budowy systemuprosta aplikacja z menu i dialogami, którą utworzymy tutaj krok po kroku

Bardziej szczegółowo

Fragmenty są wspierane od Androida 1.6

Fragmenty są wspierane od Androida 1.6 W androidzie można tworzyć dynamiczne interfejsy poprzez łączenie w moduły komponentów UI z aktywnościami. Moduły takie tworzy się za pomocą klasy Fragment, która zachowuje się jak zagnieżdżone aktywności

Bardziej szczegółowo

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

Programowanie aplikacji dla technologii mobilnych. mgr inż. Anton Smoliński Programowanie aplikacji dla technologii mobilnych mgr inż. Anton Smoliński Agenda Newsy O SQLite Co to jest? Ograniczenia Obsługa baz danych w Androidzie Tworzenie CURL Content Provider 2 Newsy 3 Newsy

Bardziej szczegółowo

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

Aktywności są związane z ekranem i definiują jego wygląd. Dzieje się to poprzez podpięcie do aktywności odpowiedniego widoku. Aktywności to podstawowe elementy związane z platformą Android. Dzięki poznaniu aktywności będziesz w stanie napisać pierwszą aplikację przeznaczoną na urządzenie mobilne. Po dodaniu kontrolek możesz w

Bardziej szczegółowo

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

DATA STORAGE. wprowadzenie Michał Mynarski. środa, 26 października 11 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

Bardziej szczegółowo

Programowanie urządzeń mobilnych w systemie Android. Ćwiczenie 7 Wykorzystanie układu LinearLayout

Programowanie urządzeń mobilnych w systemie Android. Ćwiczenie 7 Wykorzystanie układu LinearLayout Ćwiczenie 7 Wykorzystanie układu LinearLayout Cel ćwiczenia Celem ćwiczenia jest praktyczne zapoznanie się z zasadami użycia układu graficznego LinearLayout oraz wykształcenie umiejętności zastosowania

Bardziej szczegółowo

Programowanie urządzeń mobilnych. dr inż. Juliusz Mikoda

Programowanie urządzeń mobilnych. dr inż. Juliusz Mikoda Programowanie urządzeń mobilnych dr inż. Juliusz Mikoda Instalacja środowiska 1 Wymagane składniki środowiska Eclipse wersja 3.4 (Ganymede) lub 3.5 (Galileo classic) http://www.eclipse.org/downloads/packages/release/galileo/r

Bardziej szczegółowo

Język SQL, zajęcia nr 1

Język SQL, zajęcia nr 1 Język SQL, zajęcia nr 1 SQL - Structured Query Language Strukturalny język zapytań Login: student Hasło: stmeil14 Baza danych: st https://194.29.155.15/phpmyadmin/index.php Andrzej Grzebielec Najpopularniejsze

Bardziej szczegółowo

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

Programowanie aplikacji dla technologii mobilnych. mgr inż. Anton Smoliński 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

Bardziej szczegółowo

Android pierwsza aplikacja

Android pierwsza aplikacja Android pierwsza aplikacja I. Środowisko 1. Uruchomić środowisko Android Devloppers tools 2. Wybrać/Utworzyć Wokspace Mobile-cw2 II Projekt 1. Utworzyć nowy projekt klikając na w pasku narzędzi 2. Rozwinąć

Bardziej szczegółowo

Laboratorium Systemów Mobilnych. Wykład 1

Laboratorium Systemów Mobilnych. Wykład 1 Laboratorium Systemów Mobilnych 2015-02-27 Wykład 1 (Wstęp do programowania w systemie Android) Wojciech Wawrzyniak Zaliczenie wykładu i ćwiczeń Wykład omówienie zagadnień Ćwiczenie praktyczne zastosowanie

Bardziej szczegółowo

Pawel@Kasprowski.pl Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski. pawel@kasprowski.pl

Pawel@Kasprowski.pl Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski. pawel@kasprowski.pl Bazy danych Podstawy języka SQL Dr inż. Paweł Kasprowski pawel@kasprowski.pl Plan wykładu Relacyjne bazy danych Język SQL Zapytania SQL (polecenie select) Bezpieczeństwo danych Integralność danych Współbieżność

Bardziej szczegółowo

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:

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: 1. Listener dla przycisku. 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: W linii 24 tworzymy globalną metodę mglobal_onclicklistener,

Bardziej szczegółowo

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

Wprowadzenie do BD Operacje na bazie i tabelach Co poza zapytaniami? Algebra relacji. Bazy Danych i Systemy informacyjne Wykład 2. Bazy Danych i Systemy informacyjne Wykład 2 Piotr Syga 16.10.2017 Dodawanie, usuwanie i zmienianie rekordów Wstawianie rekordu wstawianie do tabeli INSERT INTO A VALUES ( fioletowy, okrągły, słodko-kwaśny

Bardziej szczegółowo

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

Aby uruchomić program klienta i połączyć się z serwerem, należy komendę: Bazy danych. Komunikacja z serwerem Aby połączyć się z serwerem i móc wykonywać czynności związane z obsługą baz, potrzebny jest program klienta. Razem z serwerem MySQL dostępny jest działający w wierszu

Bardziej szczegółowo

Powiadomienia w systemie Android

Powiadomienia w systemie Android Powiadomienia w systemie Android Powiadomienie to krótka wiadomość, która pozwala informować użytkownika o pewnych wydarzeniach pochodzących z aplikacji - będąc poza nią. Wykorzystane w odpowiedni sposób

Bardziej szczegółowo

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

AndroidManifest.xml. Plik manifestu opisuje podstawowe charakterystyki aplikacji i definiuje jej komponenty. AndroidManifest.xml Plik manifestu opisuje podstawowe charakterystyki aplikacji i definiuje jej komponenty. Jednym z najważniejszych elementów jest element który deklaruje kompatybilność z innymi

Bardziej szczegółowo

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

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1 Bazy danych Wykład IV SQL - wprowadzenie Copyrights by Arkadiusz Rzucidło 1 Czym jest SQL Język zapytań deklaratywny dostęp do danych Składnia łatwa i naturalna Standardowe narzędzie dostępu do wielu różnych

Bardziej szczegółowo

Obsługa SMS i telefonii

Obsługa SMS i telefonii Strona 1 Interfejsy API telefonii Wysyłanie wiadomości SMS Odbieranie wiadomości SMS Symulowanie nadchodzących wiadomości SMS Obsługa skrzynki wiadomości SMS Wysyłanie wiadomości e-mail Monitorowanie połączeń

Bardziej szczegółowo

Programowanie w Ruby

Programowanie w Ruby Programowanie w Ruby Wykład 11 Marcin Młotkowski 19 grudnia 2012 Plan wykładu Modele danych i bazy danych Modele danych Migracje Bazy danych w Railsach Rusztowania Walidacja modeli Modele danych Definicje

Bardziej szczegółowo

JAVA W SUPER EXPRESOWEJ PIGUŁCE

JAVA W SUPER EXPRESOWEJ PIGUŁCE JAVA W SUPER EXPRESOWEJ PIGUŁCE Obiekt Obiekty programowe to zbiór własności i zachowań (zmiennych i metod). Podobnie jak w świecie rzeczywistym obiekty posiadają swój stan i zachowanie. Komunikat Wszystkie

Bardziej szczegółowo

Laboratorium Systemów Mobilnych. Wykład 2

Laboratorium Systemów Mobilnych. Wykład 2 Laboratorium Systemów Mobilnych 2015-03-06 Wykład 2 (Aktywności proste zapamiętywanie danych) Wojciech Wawrzyniak Przypomnienie (elementy aplikacji) Składniki aplikacji Aktywności (Activity) Widoki (Views)

Bardziej szczegółowo

DECLARE VARIABLE zmienna1 typ danych; BEGIN

DECLARE VARIABLE zmienna1 typ danych; BEGIN Procedury zapamiętane w Interbase - samodzielne programy napisane w specjalnym języku (właściwym dla serwera baz danych Interbase), który umożliwia tworzenie zapytań, pętli, instrukcji warunkowych itp.;

Bardziej szczegółowo

Android - Kontakty. Łukasz Dudzioski

Android - Kontakty. Łukasz Dudzioski Android - Kontakty Łukasz Dudzioski Kontakty informacje Oparte na androidowej bazie danych Contact API zarządzany dostęp do bazy danych Niskopoziomowy dostęp Duża zmiana od wersji 2.0 Schemat bazy danych

Bardziej szczegółowo

Programowanie Urządzeń Mobilnych. Część II: Android. Wykład 2

Programowanie Urządzeń Mobilnych. Część II: Android. Wykład 2 Programowanie Urządzeń Mobilnych Część II: Android Wykład 2 1 Aplikacje w systemie Android Aplikacje tworzone są w języku Java: Skompilowane pliki programów ( dex ) wraz z plikami danych umieszczane w

Bardziej szczegółowo

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

Ref. 7 - Język SQL - polecenia DDL i DML Ref. 7 - Język SQL - polecenia DDL i DML Wprowadzenie do języka SQL. Polecenia generujące strukturę bazy danych: CREATE, ALTER i DROP. Polecenia: wprowadzające dane do bazy - INSERT, modyfikujące zawartość

Bardziej szczegółowo

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik Technologia Przykłady praktycznych zastosowań wyzwalaczy będą omawiane na bazie systemu MS SQL Server 2005 Wprowadzenie

Bardziej szczegółowo

PHP: bazy danych, SQL, AJAX i JSON

PHP: bazy danych, SQL, AJAX i JSON 1 PHP: bazy danych, SQL, AJAX i JSON SYSTEMY SIECIOWE Michał Simiński 2 Bazy danych Co to jest MySQL? Jak się połączyć z bazą danych MySQL? Podstawowe operacje na bazie danych Kilka dodatkowych operacji

Bardziej szczegółowo

Tworzenie wydajnych interfejsów. Autorzy: Piotr Michałkiewicz, 2 rok AiR Daniel Maksymow, 2 rok Informatyki

Tworzenie wydajnych interfejsów. Autorzy: Piotr Michałkiewicz, 2 rok AiR Daniel Maksymow, 2 rok Informatyki Tworzenie wydajnych interfejsów Autorzy: Piotr Michałkiewicz, 2 rok AiR Daniel Maksymow, 2 rok Informatyki Wstęp Tematem dzisiejszych zajęć będą: - Layouty - FrameLayout - LinearLayout - RelativeLayout

Bardziej szczegółowo

Programowanie w Ruby

Programowanie w Ruby Programowanie w Ruby Wykład 11 Marcin Młotkowski 19 grudnia 2014 Plan wykładu 1 Projekt 2 Modele danych 3 4 5 Marcin Młotkowski Programowanie w Ruby 2 / 38 Zasady Projekt Składowe projektu przynajmniej

Bardziej szczegółowo

Wykład 4. SQL praca z tabelami 1

Wykład 4. SQL praca z tabelami 1 Wykład 4 SQL praca z tabelami 1 Typy danych Typy liczbowe Typy całkowitoliczbowe Integer types - Typ INTEGER; 32-bitowa liczba ze znakiem z zakresu -2 31 do 2 31 1 - Typ SMALLINT; typ całkowity mniejszy

Bardziej szczegółowo

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami. UML a kod w C++ i Javie Projektowanie oprogramowania Dokumentowanie oprogramowania Diagramy przypadków użycia Przewoznik Zarzadzanie pojazdami Optymalizacja Uzytkownik Wydawanie opinii Zarzadzanie uzytkownikami

Bardziej szczegółowo

akademia androida Intencje oraz URI część III

akademia androida Intencje oraz URI część III akademia androida Intencje oraz URI część III agenda 1. Czym są intencje i po co się ich używa? 2. Czym jest URI? 3. Zadanie 1. 4. Zadanie 2 (domowe). 1. Czym są intencje i po co się ich używa? Intencje

Bardziej szczegółowo

Laboratorium 7 Blog: dodawanie i edycja wpisów

Laboratorium 7 Blog: dodawanie i edycja wpisów Laboratorium 7 Blog: dodawanie i edycja wpisów Dodawanie nowych wpisów Tworzenie formularza Za obsługę formularzy odpowiada klasa Zend_Form. Dla każdego formularza w projekcie tworzymy klasę dziedziczącą

Bardziej szczegółowo

Przechowywanie danych

Przechowywanie danych Przechowywanie danych Aplikacja na Androidzie może zapisywać i odczytywać pliki Pliki mogą być prywatne dla aplikacji lub dostępne publicznie Można je zapisywać na urządzeniu lub na karcie pamięci Bazy

Bardziej szczegółowo

Instrukcja implementacji sterownika wirtualnego portu szeregowego dla systemu Android. Opracowanie: Elzab Soft sp. z o.o.

Instrukcja implementacji sterownika wirtualnego portu szeregowego dla systemu Android. Opracowanie: Elzab Soft sp. z o.o. Instrukcja implementacji sterownika wirtualnego portu szeregowego dla systemu Android. Opracowanie: Elzab Soft sp. z o.o. 29.06.2015 2 Spis treści 1. Wymagania...4 2. Uprawnienia systemowe...4 3. Uprawnienie

Bardziej szczegółowo

Bazy danych. Dr inż. Paweł Kasprowski

Bazy danych. Dr inż. Paweł Kasprowski Plan wykładu Bazy danych Podstawy relacyjnego modelu danych Dr inż. Paweł Kasprowski pawel@kasprowski.pl Relacyjne bazy danych Język SQL Zapytania SQL (polecenie select) Bezpieczeństwo danych Integralność

Bardziej szczegółowo

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

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak Java język programowania obiektowego Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak 1 Język Java Język Java powstał w roku 1995 w firmie SUN Microsystems Java jest językiem: wysokiego

Bardziej szczegółowo

Projektowanie systemów baz danych

Projektowanie systemów baz danych Projektowanie systemów baz danych Seweryn Dobrzelewski 4. Projektowanie DBMS 1 SQL SQL (ang. Structured Query Language) Język SQL jest strukturalnym językiem zapewniającym możliwość wydawania poleceń do

Bardziej szczegółowo

Bazy danych 7. SQL podstawy

Bazy danych 7. SQL podstawy Bazy danych 7. SQL podstawy P. F. Góra http://th-www.if.uj.edu.pl/zfs/gora/ semestr letni 2005/06 Structured Query Language Używane standardy: SQL92 SQL99 SQL:2003 Żaden dostawca nie jest w pełni zgodny

Bardziej szczegółowo

Paweł Cieśla. Dokumentacja projektu

Paweł Cieśla. Dokumentacja projektu Paweł Cieśla Dokumentacja projektu Projekt Project1 został utworzony i skompilowany na próbnej wersji Delphi XE 4. Po uruchomieniu programu należy kliknąć przycisk Wczytaj plik tekstowy, następnie wskazać

Bardziej szczegółowo

Zaawansowane aplikacje WWW - laboratorium

Zaawansowane aplikacje WWW - laboratorium Zaawansowane aplikacje WWW - laboratorium Przetwarzanie XML (część 2) Celem ćwiczenia jest przygotowanie aplikacji, która umożliwi odczyt i przetwarzanie pliku z zawartością XML. Aplikacja, napisana w

Bardziej szczegółowo

NARZĘDZIA WIZUALIZACJI

NARZĘDZIA WIZUALIZACJI Kurs interaktywnej komunikacji wizualnej NARZĘDZIA WIZUALIZACJI Andrzej Łachwa andrzej.lachwa@uj.edu.pl 3 4/8 Zobacz film: http://www.ted.com/talks/david_mccandless_the_beauty_of_dat a_visualization.html

Bardziej szczegółowo

D D L S Q L. Co to jest DDL SQL i jakie s jego ą podstawowe polecenia?

D D L S Q L. Co to jest DDL SQL i jakie s jego ą podstawowe polecenia? D D L S Q L Co to jest DDL SQL i jakie s jego ą podstawowe polecenia? D D L S Q L - p o d s t a w y DDL SQL (Data Definition Language) Jest to zbiór instrukcji i definicji danych, którym posługujemy się

Bardziej szczegółowo

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

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 cur.executescript(""" DROP TABLE IF EXISTS uczen; CREATE TABLE IF NOT EXISTS uczen ( Uniwersytet Technologiczno-Przyrodniczy im. J.J. Śniadeckich w Bydgoszczy Instrukcja do ćwiczeń laboratoryjnych Przedmiot

Bardziej szczegółowo

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

Wykład 5: PHP: praca z bazą danych MySQL Wykład 5: PHP: praca z bazą danych MySQL Architektura WWW Podstawowa: dwuwarstwowa - klient (przeglądarka) i serwer WWW Rozszerzona: trzywarstwowa - klient (przeglądarka), serwer WWW, serwer bazy danych

Bardziej szczegółowo

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

Laboratorium nr 4. Temat: SQL część II. Polecenia DML Laboratorium nr 4 Temat: SQL część II Polecenia DML DML DML (Data Manipulation Language) słuŝy do wykonywania operacji na danych do ich umieszczania w bazie, kasowania, przeglądania, zmiany. NajwaŜniejsze

Bardziej szczegółowo

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

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h] 1. Typy. Java jest językiem programowania z silnym systemem kontroli typów. To oznacza, że każda zmienna, atrybut czy parametr ma zadeklarowany typ. Kompilator wylicza typy wszystkich wyrażeń w programie

Bardziej szczegółowo

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL. Prezentacja Danych i Multimedia II r Socjologia Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL. Celem ćwiczeń jest poznanie zasad tworzenia baz danych i zastosowania komend SQL. Ćwiczenie I. Logowanie

Bardziej szczegółowo

PHP 5 język obiektowy

PHP 5 język obiektowy PHP 5 język obiektowy Wprowadzenie Klasa w PHP jest traktowana jak zbiór, rodzaj różnych typów danych. Stanowi przepis jak stworzyć konkretne obiekty (instancje klasy), jest definicją obiektów. Klasa reprezentuje

Bardziej szczegółowo

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

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych Języki programowania wysokiego poziomu PHP cz.4. Bazy danych PHP i bazy danych PHP może zostać rozszerzony o mechanizmy dostępu do różnych baz danych: MySQL moduł mysql albo jego nowsza wersja mysqli (moduł

Bardziej szczegółowo

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

Wdrożenie modułu płatności eservice. dla systemu Zen Cart 1.3.9 1.5 Wdrożenie modułu płatności eservice dla systemu Zen Cart 1.3.9 1.5 - dokumentacja techniczna Wer. 01 Warszawa, styczeń 2014 1 Spis treści: 1 Wstęp... 3 1.1 Przeznaczenie dokumentu... 3 1.2 Przygotowanie

Bardziej szczegółowo

Systemy operacyjne na platformach mobilnych

Systemy operacyjne na platformach mobilnych Systemy operacyjne na platformach mobilnych Wykład 2 Grzegorz Jabłoński, Piotr Perek Katedra Mikroelektroniki i Technik Informatycznych Zagadnienia wykładu Interfejs użytkownika Activity Views Resources

Bardziej szczegółowo

Autor: Joanna Karwowska

Autor: Joanna Karwowska Autor: Joanna Karwowska Klucz podstawowy PRIMARY KEY Klucz kandydujący UNIQUE Klucz alternatywny - klucze kandydujące, które nie zostały wybrane na klucz podstawowy Klucz obcy - REFERENCES Tworząc tabelę,

Bardziej szczegółowo

Inżynieria Programowania Laboratorium 3 Projektowanie i implementacja bazy danych. Paweł Paduch paduch@tu.kielce.pl

Inżynieria Programowania Laboratorium 3 Projektowanie i implementacja bazy danych. Paweł Paduch paduch@tu.kielce.pl Inżynieria Programowania Laboratorium 3 Projektowanie i implementacja bazy danych Paweł Paduch paduch@tu.kielce.pl 06-04-2013 Rozdział 1 Wstęp Na dzisiejszych zajęciach zajmiemy się projektem bazy danych.

Bardziej szczegółowo

Instrukcja podwaja zarobki osób, których imiona zaczynają się P i dalsze litery alfabetu zakładamy, że takich osbób jest kilkanaście.

Instrukcja podwaja zarobki osób, których imiona zaczynają się P i dalsze litery alfabetu zakładamy, że takich osbób jest kilkanaście. Rodzaje triggerów Triggery DML na tabelach INSERT, UPDATE, DELETE Triggery na widokach INSTEAD OF Triggery DDL CREATE, ALTER, DROP Triggery na bazie danych SERVERERROR, LOGON, LOGOFF, STARTUP, SHUTDOWN

Bardziej szczegółowo

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

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

Bardziej szczegółowo

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

Odnawialne Źródła Energii I rok. Tutorial PostgreSQL Tutorial PostgreSQL 1. Instalacja na własnym komputerze: a. Zainstaluj program ze strony: https://www.postgresql.org/download/ Wersja odpowiednia dla systemu operacyjnego Linux, Mac, Windows Przy pierwszym

Bardziej szczegółowo

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika Programowanie w SQL procedury i funkcje UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika 1. Funkcje o wartościach skalarnych ang. scalar valued

Bardziej szczegółowo

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8 Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8 Bazowy skrypt PHP do ćwiczeń z bazą MySQL: Utwórz skrypt o nazwie cw7.php zawierający następującą treść (uzupełniając go o właściwą nazwę uŝytkownika

Bardziej szczegółowo

Dokumentacja do API Javy.

Dokumentacja do API Javy. Dokumentacja do API Javy http://java.sun.com/j2se/1.5.0/docs/api/ Klasy i obiekty Klasa jest to struktura zawierająca dane (pola), oraz funkcje operujące na tych danych (metody). Klasa jest rodzajem szablonu

Bardziej szczegółowo

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

E.14 Bazy Danych cz. 18 SQL Funkcje, procedury składowane i wyzwalacze Funkcje użytkownika Tworzenie funkcji Usuwanie funkcji Procedury składowane Tworzenie procedur składowanych Usuwanie procedur składowanych Wyzwalacze Wyzwalacze a ograniczenia i procedury składowane Tworzenie

Bardziej szczegółowo

Wdrożenie modułu płatności eservice. dla systemu oscommerce 2.3.x

Wdrożenie modułu płatności eservice. dla systemu oscommerce 2.3.x Wdrożenie modułu płatności eservice dla systemu oscommerce 2.3.x - dokumentacja techniczna Wer. 01 Warszawa, styczeń 2014 1 Spis treści: 1 Wstęp... 3 1.1 Przeznaczenie dokumentu... 3 1.2 Przygotowanie

Bardziej szczegółowo

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

Instytut Mechaniki i Inżynierii Obliczeniowej   Wydział Mechaniczny Technologiczny Politechnika Śląska Instytut Mechaniki i Inżynierii Obliczeniowej www.imio.polsl.pl fb.com/imiopolsl @imiopolsl Wydział Mechaniczny Technologiczny Politechnika Śląska Laboratorium 1 Wprowadzenie, podstawowe informacje o obsłudze

Bardziej szczegółowo

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

akademia androida Service, BroadcastReceiver, ContentProvider część IV akademia androida Service, BroadcastReceiver, ContentProvider część IV agenda 1. BroadcastReceiver 2. Service 3. ContentProvider 4. Zadanie 1. 5. Zadanie 2 (domowe). 1. BroadcastReceiver BroadcastReceiver

Bardziej szczegółowo

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

Życie aktywności Nawigując przez aplikacje poszczególne Aktywności przechodzą pomiędzy stanami. Dla przykładu gdy aktywność uruchamia się po raz Życie aktywności Nawigując przez aplikacje poszczególne Aktywności przechodzą pomiędzy stanami. Dla przykładu gdy aktywność uruchamia się po raz pierwszy najpierw znajduje się w tle systemu gdzie otrzymuje

Bardziej szczegółowo

PRZESTRZENNE BAZY DANYCH WYKŁAD 2

PRZESTRZENNE BAZY DANYCH WYKŁAD 2 PRZESTRZENNE BAZY DANYCH WYKŁAD 2 Baza danych to zbiór plików, które fizycznie przechowują dane oraz system, który nimi zarządza (DBMS, ang. Database Management System). Zadaniem DBMS jest prawidłowe przechowywanie

Bardziej szczegółowo

Wykład 8. SQL praca z tabelami 5

Wykład 8. SQL praca z tabelami 5 Wykład 8 SQL praca z tabelami 5 Podzapytania to mechanizm pozwalający wykorzystywać wyniki jednego zapytania w innym zapytaniu. Nazywane często zapytaniami zagnieżdżonymi. Są stosowane z zapytaniami typu

Bardziej szczegółowo

Instrukcja 10 Laboratorium 13 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

Instrukcja 10 Laboratorium 13 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse Instrukcja 10 Laboratorium 13 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse 1 Cel laboratorium: Nabycie umiejętności przygotowywania testów akceptacyjnych za pomocą narzędzia FitNesse 1. Wg wskazówek

Bardziej szczegółowo

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

Kowalski Marcin 156439 Wrocław, dn. 3.06.2009 Jaśkiewicz Kamil 148592. Bazy Danych 1 Podstawy Projekt Temat: Baza danych do zarządzania projektami Kowalski Marcin 156439 Wrocław, dn. 3.06.2009 Jaśkiewicz Kamil 148592 Bazy Danych 1 Podstawy Projekt Temat: Baza danych do zarządzania projektami Spis treści Założenia Projektowe...1 Schemat Bazy Danych...1

Bardziej szczegółowo

Wprowadzenie do projektu QualitySpy

Wprowadzenie do projektu QualitySpy Wprowadzenie do projektu QualitySpy Na podstawie instrukcji implementacji prostej funkcjonalności. 1. Wstęp Celem tego poradnika jest wprowadzić programistę do projektu QualitySpy. Będziemy implementować

Bardziej szczegółowo

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

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3 3 ASP.NET MVC Podstawy 1 1. Cel zajęć Celem zajęć jest zapoznanie się z podstawami ASP.NET MVC 2.0 Framework. 2. Zadanie Proszę zbudować prostą aplikację WWW przy zastosowaniu framework a ASP.NET MVC 2.0

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Wykład 2: Wstęp do języka Java 3/4/2013 S.Deniziak: Programowanie obiektowe - Java 1 Cechy języka Java Wszystko jest obiektem Nie ma zmiennych globalnych Nie ma funkcji globalnych

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe IV. Interfejsy i klasy wewnętrzne Małgorzata Prolejko OBI JA16Z03 Plan Właściwości interfejsów. Interfejsy a klasy abstrakcyjne. Klonowanie obiektów. Klasy wewnętrzne. Dostęp do

Bardziej szczegółowo

Podstawowe wykorzystanie Hibernate

Podstawowe wykorzystanie Hibernate Podstawowe wykorzystanie Hibernate Cel Wykonanie prostej aplikacji webowej przedstawiającą wykorzystanie biblioteki. Aplikacja sprawdza w zależności od wybranej metody dodaje, nową pozycje do bazy, zmienia

Bardziej szczegółowo

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

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018 Informatyka I Klasy i obiekty. Podstawy programowania obiektowego dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2018 Plan wykładu Pojęcie klasy Deklaracja klasy Pola i metody klasy

Bardziej szczegółowo

Hurtownia Świętego Mikołaja projekt bazy danych

Hurtownia Świętego Mikołaja projekt bazy danych Aleksandra Kobusińska nr indeksu: 218366 Hurtownia Świętego Mikołaja projekt bazy danych Zaprezentowana poniżej baza jest częścią większego projektu bazy danych wykorzystywanej w krajowych oddziałach wiosek

Bardziej szczegółowo

Wykład 7: Pakiety i Interfejsy

Wykład 7: Pakiety i Interfejsy Wykład 7: Pakiety i Interfejsy Plik Źródłowy w Javie Składa się z: instrukcji pakietu (pojedyncza, opcjonalna) instrukcji importujących (wielokrotne, opcjonalne) deklaracji klasy publicznej (pojedyncza,

Bardziej szczegółowo

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

Programowanie urządzeń mobilnych. dr inż. Andrzej Grosser na podstawie wykładu dr inż. Juliusza Mikody Programowanie urządzeń mobilnych dr inż. Andrzej Grosser na podstawie wykładu dr inż. Juliusza Mikody Rozmieszczenie przykład Jaki układu rozmieszczający powinien zostać wykorzystany? AbsoluteLayout, TableLayout,

Bardziej szczegółowo

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

Bazy danych dla producenta mebli tapicerowanych. Bartosz Janiak Marcin Sikora Wrocław 9.06.2015 r. Bazy danych dla producenta mebli tapicerowanych Bartosz Janiak Marcin Sikora Wrocław 9.06.2015 r. Założenia Stworzyć system bazodanowy dla małej firmy produkującej meble tapicerowane. Projekt ma umożliwić

Bardziej szczegółowo

Aplikacje w środowisku Java

Aplikacje w środowisku Java Aplikacje w środowisku Java Materiały do zajęć laboratoryjnych Klasy i obiekty - dziedziczenie mgr inż. Kamil Zieliński Katolicki Uniwersytet Lubelski Jana Pawła II 2018/2019 W ramach poprzedniego laboratorium

Bardziej szczegółowo

Programowanie usług działających w tle

Programowanie usług działających w tle Programowanie usług działających w tle Android Paweł Szafer Po co programować usługi działające w tle? Plan prezentacji O aplikacjach w Androidzie, Sposób podejmowania decyzji o zabiciu procesu, Rodzaje

Bardziej szczegółowo

15. Funkcje i procedury składowane PL/SQL

15. Funkcje i procedury składowane PL/SQL 15. Funkcje i procedury składowane PLSQL 15.1. SQL i PLSQL (Structured Query Language - SQL) Język zapytań strukturalnych SQL jest zbiorem poleceń, za pomocą których programy i uŝytkownicy uzyskują dostęp

Bardziej szczegółowo

Bazy danych 10. SQL Widoki

Bazy danych 10. SQL Widoki Bazy danych 10. SQL Widoki P. F. Góra http://th-www.if.uj.edu.pl/zfs/gora/ semestr letni 2005/06 Widoki, AKA Perspektywy W SQL tabela, która utworzono za pomoca zapytania CREATE TABLE, nazywa się tabela

Bardziej szczegółowo

Pawel@Kasprowski.pl Bazy danych. Bazy danych. Zapytania SELECT. Dr inż. Paweł Kasprowski. pawel@kasprowski.pl

Pawel@Kasprowski.pl Bazy danych. Bazy danych. Zapytania SELECT. Dr inż. Paweł Kasprowski. pawel@kasprowski.pl Bazy danych Zapytania SELECT Dr inż. Paweł Kasprowski pawel@kasprowski.pl Przykład HAVING Podaj liczebność zespołów dla których najstarszy pracownik urodził się po 1940 select idz, count(*) from prac p

Bardziej szczegółowo

Projekt Hurtownia, realizacja skojarzeń dostawców i produktów

Projekt Hurtownia, realizacja skojarzeń dostawców i produktów niżej. Projekt Hurtownia, realizacja skojarzeń dostawców i produktów W bazie danych HurtowniaSP istnieją tabele Dostawcy oraz Produkty, ich definicje przypomniane są W bazie zdefiniowano także tabelę DostawcyProdukty,

Bardziej szczegółowo

Projekt Hurtownia, realizacja rejestracji dostaw produktów

Projekt Hurtownia, realizacja rejestracji dostaw produktów Projekt Hurtownia, realizacja rejestracji dostaw produktów Ćwiczenie to będzie poświęcone zaprojektowaniu formularza pozwalającego na rejestrację dostaw produktów dla naszej hurtowni. Dane identyfikujące

Bardziej szczegółowo

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Polimorfizm, metody wirtualne i klasy abstrakcyjne Programowanie obiektowe Polimorfizm, metody wirtualne i klasy abstrakcyjne Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski pwr.wroc.pl Polimorfizm,

Bardziej szczegółowo

Dokumentacja SQL API 1

Dokumentacja SQL API 1 Dokumentacja SQL API 1 Wprowadzenie... 2 Kody błędów... 3 Tworzenie konfiguracji... 4 Konfiguracja po stronie Klienta... 6 Konfiguracja po stronie SerwerSMS... 8 Archiwizacja danych... 9 2 Wprowadzenie

Bardziej szczegółowo

Projektowanie bazy danych. Jarosław Kuchta Projektowanie Aplikacji Internetowych

Projektowanie bazy danych. Jarosław Kuchta Projektowanie Aplikacji Internetowych Projektowanie bazy danych Jarosław Kuchta Projektowanie Aplikacji Internetowych Możliwości projektowe Relacyjna baza danych Obiektowa baza danych Relacyjno-obiektowa baza danych Inne rozwiązanie (np. XML)

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Laboratorium z przedmiotu Programowanie obiektowe - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia.

Bardziej szczegółowo

Metody dostępu do danych

Metody dostępu do danych Metody dostępu do danych dr inż. Grzegorz Michalski Na podstawie materiałów dra inż. Juliusza Mikody Jak działa JDO Podstawowym zadaniem JDO jest umożliwienie aplikacjom Javy transparentnego umieszczenia

Bardziej szczegółowo

Przykład 3 Zdefiniuj w bazie danych hurtownia_nazwisko przykładową funkcję użytkownika fn_rok;

Przykład 3 Zdefiniuj w bazie danych hurtownia_nazwisko przykładową funkcję użytkownika fn_rok; Temat: Funkcje, procedury i wyzwalacze. Oprócz tabel i widoków w bazach danych możemy tworzyć własne funkcje, procedury i specjalny typ procedur, które będą automatycznie wywoływanie przez MySQL w memencie

Bardziej szczegółowo

Mechanizm zapisu preferencji

Mechanizm zapisu preferencji Mechanizm zapisu preferencji Tłumaczenie i adaptacja materiałów: dr Tomasz Xięski. Na podstawie prezentacji udostępnionych przez Victor Matos, Cleveland State University. Portions of this page are reproduced

Bardziej szczegółowo

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

Aplikacje bazodanowe. Laboratorium 1. Dawid Poªap Aplikacje bazodanowe - laboratorium 1 Luty, 22, / 37 Aplikacje bazodanowe Laboratorium 1 Dawid Poªap Aplikacje bazodanowe - laboratorium 1 Luty, 22, 2017 1 / 37 Plan 1 Informacje wst pne 2 Przygotowanie ±rodowiska do pracy 3 Poj cie bazy danych 4 Relacyjne

Bardziej szczegółowo

Programowanie urządzeń mobilnych w systemie Android. Ćwiczenie 8 Wykorzystanie układu RelativeLayout

Programowanie urządzeń mobilnych w systemie Android. Ćwiczenie 8 Wykorzystanie układu RelativeLayout Ćwiczenie 8 Wykorzystanie układu RelativeLayout Cel ćwiczenia Celem ćwiczenia jest praktyczne zapoznanie się z zasadami użycia układu graficznego RelativeLayout oraz wykształcenie umiejętności zastosowania

Bardziej szczegółowo