SW 07d(full permission)


Systemy Wbudowane
Dr inż. Mariusz Fraś
Android
cz. 3
© maf 1
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Kontrolki dziedziczÄ…ce po AdapterView
" Adaptery
OdpowiadajÄ… za utworzenie/dostarczenie
widoków (każdego elementu danych) do
pojemnika
Adapter
Dane
danych
Klasy dziedziczÄ…ce po
android.widget.Adapter
adaptery opis
ArrayAdapter najprostszy, dla ListView
Służą do powiązania kontrolek-
do danych statycznych (też z
pojemników dziedziczących po SimpleAdapter
zasobów)
klasie AdapterView z
dostarcza dane poprzez tzw.
CursorAdapter
kursor treści
danymi, które są umieszczane
ResourceCursor dziedziczy po CursorAdapter,
w tych kontrolkach
Adapter
tworzy widoki z zasobów
" Dla: ListView, Spinner ,
klasa abstrakcyjna, dziedziczÄ…c
BaseAdapter
po niej można tworzyć adaptery
GridView, Gallery
niestandardowe
© maf 2
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Kontrolki dziedziczÄ…ce po AdapterView
" ArrayAdapter
Konstrukcja:
objects
lista/tablica obiektów dla wyświetlanej listy
Resource
ID pliku układu (layout file) zawierający układ
(layout) używany do utworzenia widoku
ArrayAdapter
lub
textViewResourceId
ID pliku układu (layout file) zawierający
TextView używany do utworzenia widoku
context
kontekst wykonania
Ustawienie układu dla widoku z rozwiniętą listą:
" ArrayAdaper.setDropDownViewResource(int id_zasobu)
WiÄ…zanie widoku z adapterem
" AdapterView.setAdapter(T adapter)
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Spinner
" Definicja widoku w pliku XML

...>
...
... />
android:id="@+id/spinner1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView_dwa"
android:layout_centerHorizontal="true" />

© maf 4
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Spinner
" Utworzenie adaptera i powiazanie (wersja 1)
import android.widget.ArrayAdapter;
import android.widget.AdapterView;
import android.widget.Spinner;
public class Dwa extends Activity
implements AdapterView.OnItemSelectedListener
{
String[] lis = {"Pozycja nr 1", "Pozycja nr 2",
"Pozycja nr 3", "Pozycja nr 4"};
protected void onCreate(Bundle savedInstanceState)
{
...
Spinner opcje = (Spinner) findViewById(R.id.spinner1);
opcje.setOnItemSelectedListener(this);
ArrayAdapter adap = new ArrayAdapter
(this, android.R.layout.simple_spinner_item, lis);
adap.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
opcje.setAdapter(adap);
}
}
© maf 5
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Spinner
" Utworzenie adaptera i powiazanie (wersja 2)
w pliku XML

Strings.xml


pozycja nr 1
pozycja nr 2
pozycja nr 3
pozycja nr 4


public class Dwa extends Activity implements AdapterView.OnItemSelectedListener
{
protected void onCreate(Bundle savedInstanceState)
{
...
Spinner opcje = (Spinner) findViewById(R.id.spinner1);
opcje.setOnItemSelectedListener(this);
ArrayAdapter adap = ArrayAdapter.createFromResource(this,
R.array.opcje_wyboru, android.R.layout.simple_spinner_item);
adap.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
opcje.setAdapter(adap);
}}
© maf 6
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Zakładki
" Układ graficzny z zakładkami
Węzły
" TabHost
" TabWidget
" FrameLayout
Dwie ikony na zakładkę
" Aktywna i nieaktywna
Najlepiej jedna aktywność na
zakładkę
developer.android.com podaje:
" Główna aktywność: rozszerza
TabActivity
" Uwaga: od Androida w wersji 3.0
zakładki można realizować także
inaczej  za pomocÄ… ActionBar
© maf 7
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Zakładki
" Układ graficzny z zakładkami
plik XML definiujÄ…cy
układ graficzny

android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
jeśli jedna aktywność, tu
/>
wstawiamy odpowiednie

widoki (też układy)
© maf 8
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Zakładki
" Układ graficzny z zakładkami
pliku kodu
public void onCreate(Bundle savedInstanceState)
głównej aktywności
{ ...
Resources zas = getResources(); // obiekt zasobów
TabHost tabs = getTabHost(); // TabHost dla aktywności
TabHost.TabSpec spec; // TabSpec używany dla każdej zakładki
// do konfiguracji
utworzenie intencji do
Intent intencja;
uruchamiania aktywności zakładki
intencja = new Intent().setClass(this, Aktywnosc1.class); inicjalizacja
TabSpec dla
spec = tabs.newTabSpec("tab1"); //id
zakładki
tabs.setIndicator("tab1", zas.getDrawable(R.drawable.ic_tab1));
spec.setContent(intencja);
napis i opcjonalnie obrazek
tabs.addTab(spec);
dodanie TabSpec do TabHost i zwiÄ…zanie z TabWidget
intencja = new Intent().setClass(this, Aktywnosc2.class);
spec = tabs.newTabSpec("tab2").setIndicator("tab2",
zas.getDrawable(R.drawable.ic_tab2)).setContent(intencja);
tabs.addTab(spec);
... // powtarzamy dla pozostałych zakładek
domyślnie wyświetlana
tabs.setCurrentTab(0);
pierwsza zakładka
}
© maf 9
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Zakładki
" Słuchacz monitorujący wybór zakładek
Opcjonalne, dodatkowe działanie przy zmianie zakładki
Należy dodać kod słuchacza OnTabChangeListener do metody
onCreate()
protected void onCreate(Bundle savedInstanceState) {
pliku kodu
...
aktywności
// tabHost.setCurrentTab(0);
// można też użyć:
tabs.setCurrentTabByTag("tab1");
tabs.setOnTabChangedListener(new OnTabChangeListener()
{
public void onTabChanged(String tagId) {
... // tu zrób co chcesz, np.:
String text =  Jestem w: " + tagId + "\nindex: "
+ abs.getCurrentTab();
Toast.makeText(getApplicationContext(), text, 1).show();
}
});
wyświeli:
}
 Jestem w: tab1
index: 0
© maf 10
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Menu
" Rodzaje menu
W aplikacjach Androida można tworzyć kilka rodzajów menu.
Menu można tworzyć i obsługiwać na kilka sposobów
Najbardziej podstawowe menu aplikacji to:
" menu standardowe aktywności,
" podmenu (submenu)
" menu kontekstowe
Menu
" Menu aktywności
obiekt klasy Menu
MenuItem
Części składowe
" elementy typu MenuItem (pozycje menu)
SubMenu
" SubMenu (podmenu).
MenuItem
© maf 11
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Menu
" Tworzenie menu
Aktywność jest powiązana tylko z jednym menu standardowym
Tworzy siÄ™ je implementujÄ…c metodÄ™ onCreateOptionsMenu
" Metoda ta jest wywoływana w aplikacji tylko raz
Tworzenie elementów (obiektów) menu
" Dwa sposoby:
" definiujÄ…c menu w pliku XML
" wywołując metodę Menu.add(...)
" Metoda Menu.add(...)
MenuItem add (int groupId, int itemId, int order, CharSequence title)
groupId=NONE jeśli unikalny id nazwa opcji
określa kolejność
nie mamy grup pozycji w menu
w menu
© maf 12
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Menu
" Tworzenie menu
public boolean onCreateOptionsMenu(Menu moje_menu) {
super.onCreateOptionsMenu(moje_menu);
MenuItem poz1 = moje_menu.add(0, 1, 1,  opcja 1 );
MenuItem poz2 = moje_menu.add(0, 2, 2,  opcja 2 );
...
poz1.setIcon(R.drawable.id_obrazka1);
poz2.setIcon(R.drawable.id_obrazka2);
...
}
© maf 13
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Menu
" Dodanie podmenu
public boolean onCreateOptionsMenu(Menu menu) {
SubMenu sm = menu.addSubMenu(smGrID, smItemId, smOrder,  Tytuł");
...//tworzenie pozycji submenu
...//tak jak menu aktywności
}
" Obsługa wyboru elementu
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemID()) // identyfikacja wybranego elementu
{
case R.id.pozycja1: ... // dla klikniętych elementów menu
return true;
case R.id.pozycja1: ...
return true;
default:
// dla nieprzetwarzanych elementów menu
return super.onOptionsItemSelected(item);
}
}
© maf 14
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Menu
" Tworzenie menu metodÄ… poprzez plik XML


android:icon="@drawable/ic_poz1"
android:title="@string/opcja1"
android:icon="@drawable/ic_poz2"
android:title= opcja2" />

Tworzenie obiektów menu na podstawie XMLa
" Metoda inflate klasy MenuInflater
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater wypelniacz = getMenuInflater();
wypelniacz.inflate(R.menu.moje_menu, menu);
... return true;
}
© maf 15
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Menu kontekstowe
" Menu kontekstowe
Metoda onCreateContextMenu jest wywoływana każdorazowo
przy wywoływaniu menu kontekstowego
" Długie naciśnięcie (jedyny sposób dla wersji < 3.0)
" Zawartość usuwana po wyjściu z menu
public boolean onCreateContextMenu(ContextMenu cm,
View v,
ContextMenuInfo cmi)
{
super.onCreateContextMenu(cm, v, cmi);
// dla różnych menu dla różnych widoków:
if (v.getId() == widok1.getId())
{...} //tworzenie tak jak menu aktywności
if (v.getId() == widok2.getId())
{...} //tworzenie tak jak menu aktywności
cm.setHeaderTitle( Bardzo długi tytuł menu & ");
cm.setHeaderIcon(R.drawable.id_obrazka);
...
}
© maf 16
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Menu kontekstowe
" Obsługa wyboru elementu
public boolean onContextItemSelected(MenuItem item)
{
switch (item.getItemID()) // identyfikacja wybranego elementu
{
case R.id.pozycja1: ... // dla klikniętych elementów menu
return true;
case R.id.pozycja1: ...
return true;
default:
// dla nieprzetwarzanych elementów menu
return super.onContextItemSelected(item);
}
}
" UWAGA: tzw. tryb akcji kontekstowej (ang. contextual
action mode) jest zupełnie innym mechanizmem
stosowanym tylko w Android >= 3.0
© maf 17
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Dane trwałe
" Trwałe przechowywanie danych
Android udostępnia kilka mechanizmów służących do przechowywania
danych:
" Współdzielone ustawienia (ang. Shared Preferences)
" przechowywanie prywatnych danych aplikacji
" Pamięć wewnętrzna (ang. Internal Storage)
" przechowywanie prywatnych plików w pamięci urządzenia
" Pamięć zewnętrzna (ang. External Storage)
" przechowywanie publicznych danych na wymiennych nośnikach pamięci
" Baza danych SQLite
" przechowywanie struktur danych w prywatnej, relacyjnej bazie danych
Także:
" Zasoby sieciowe (ang. Network Connections)
" Przechowywanie danych na serwerach webowych
W Androidzie wszystkie dane sÄ… prywatne
Jest mechanizm udostępniania danych prywatnych innym aplikacjom
poprzez dostawców treści (ang. content providers)
" Tu: nie omawiany
© maf 18
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Dane trwałe
" Współdzielone preferencje (ang. Shared Preferences)
Pozwalają zapisywać podstawowe typy danych w postaci par:
klucz-wartość
Są one cały czas dostępne dla aplikacji (również po zabiciu jej)
Operacje za pomocÄ… klas:
" SharedPreferences i SharedPreferences.Editor
" Odczyt i zapis danych poprzez metody:
getXxx(& ) i putXxx(& )
" Xxx = {Int, Long, Double, String, Boolean}
" np. getString()
getXxx(& )
getAll()
Preferencje
contains(& )
klucz 1 wartość 1
&
klucz 2 wartość 2
putXxx(& )
... ...
Editor
remove(& )
... ...
clear()
commit()
© maf 19
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Dane trwałe
" Współdzielone preferencje (ang. Shared Preferences)
Uzyskanie dostępu do preferencji (z kontekstu)
" SharedPreferences getPreferences(String name, int mode)
" SharedPreferences getSharedPreferences(String name, int mode)
" MODE_PRIVATE " MODE_WORLD_READABLE
" MODE_MULTI_PROCESS " MODE_WORLD_WRITEABLE
Uzyskanie edytora
" SharedPreferences.Editor SharedPreferences.edit()
Schemat obsługi
protected void onCreate(Bundle savedInstanceState)
{ ...
SharedPreferences dane = getSharedPreferences("nazwa_pliku", tryb);
int dana1 = dane.getInt("nazwa_danej",jakaś_wartość);
...}
wartość domyślna
tryb
(jeśli jej nie ma)
dostępu
protected void onStop() { ...
SharedPreferences.Editor edytor = dane.edit();
edytor.putInt("nazwa_danej", jakaś_wartość);
editor.commit();
...}
© maf 20
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Dane trwałe
" Pamięć wewnętrzna (ang. Internal Storage)
Można zapisywać pliki z danymi dla aplikacji
Są to zwykle dane prywatne (domyślnie dostępne tylko dla aplik.)
Dostęp uzyskuje się metodą
" openFileInput() " openFileOutput()
Odczyt i zapis dokonuje siÄ™ ze strumienia pliku
" FileInputStream " FileOutputStream
Przykład zapisu
String nazwa_pliku = "mój_plik";
String dane = "Tekst do zapisu!";
FileOutputStream os;
try {
os = openFileOutput(nazwa_pliku, Context.MODE_PRIVATE);
os.write(string.getBytes());
tryb
os.close();
dostępu
} catch (Exception e) {
e.printStackTrace();
}
© maf 21
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Dane trwałe
" Pamięć zewnętrzna (ang. External Storage)
Dla danych publicznych
Pamięć zewnętrzna musi być dostępna
" Wymaga uprawnień w pliku manifestu:
"android.permission.WRITE_EXTERNAL_STORAGE" />
" READ jest domyślnie, ale należy deklarować
" Dostęp można sprawdzić za pomocą metody
String getExternalStorageState() klasy Environment
" Klasa Environmentdostarcza informacji o środowisku
String status = Environment.getExternalStorageState();
porównanie
uprawnień
if (Environment.MEDIA_MOUNTED.equals(status)){
// Można odczytywać i zapisywać
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(status)) {
// Można tylko czytać
} else {
// Coś nie tak! Jakiś inny status  ale nie można operacji we/wy
}
© maf 22
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Dane trwałe
" Pamięć zewnętrzna (ang. External Storage)
Katalog dla plików można uzyskać za pomocą klasy i metody:
" Dla wersji API 7 i mniejszej:
File Environment.getExternalStorageDirectory()
" Katalog: /Android/data//files/
" Dla wersji API 8 i większej
File Environment.getExternalStoragePublicDirectory(String
type)
File Context.getExternalFilesDir(String type)
" Typ:
DIRECTORY_MUSIC, DIRECTORY_RINGTONES, DIRECTORY_PICTURES, &
Odczyt i zapis realizuje się podobnie jak dla pamięci wewnętrznej
© maf 23
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Dane trwałe
" SQLite
Wsparcie dla przechowywania informacji w bazie danych
zapewnia kilka klas wśród których najważniejsze to:
" SQLiteDatabase  podstawowa klasa udostępniająca metody
operacji na bazach danych.
" Cursor  typ obiektu zwracany w wyniku wykonywania zapytań przy
pomocy metod klasy SQLiteDatabase
" SQLiteOpenHelper  klasa pomocnicza, wspomagajÄ…ca tworzenie
baz danych, zarzÄ…dzanie wersjami baz, oraz nawiÄ…zywanie z nimi
połączenia
Operacje / zapytania (ang. queries)
" Retrieval queries  operacje SQL typu select
" Cursor SQLDatabase.rawQuery(...) zapytania  surowe
" Cursor SQLDatabase.query(...)  zapytania parametryzowane
" Action queries  manipulacje na tablicach, użytkownikach itp.
" SQLDatabase.execSQL(...)
SQLiteDatabase db;
db.execSQL("create table nazwa ...");
© maf 24
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Obsługa SQLite
" Bezpośrednie otwieranie/tworzenie bazy
SQLiteDatabase SQLiteDatabase.openDatabase(
String path,
opcjonalne
SQLiteDatabase.CursorFactory factory,
int mode)
" Domyślny prefiks: /data/data//databases/
SQLiteDatabase SQLiteDatabase.openOrCreateDatabase(
String path,
opcjonalne
SQLiteDatabase.CursorFactory factory)
... inne
SQLiteDatabase db;
może być też
try {
pełna ścieżka
db = SQLiteDatabase.openDatabase("moja_baza",
null,
SQLiteDatabase.CREATE_IF_NECESSARY);
db.close();
}
catch (SQLiteException e) {...}
© maf 25
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Obsługa SQLite
" Klasa rozszerzajÄ…ca SQLiteOpenHelper
Rekomendowanym przez OHA podejściem do tworzenia bazy dla
aplikacji jest wykorzystanie klasy SQLiteOpenHelper i
przykrycie jej metody onCreate(& ) (oraz ewentualnie innych)
" Nie jest to jednak konieczne i można bezpośrednio wykorzystywać
klasÄ™ SQLiteDatabase i jej metody
public class RepozytoriumOH extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DB_NAME = "nazwa_bazy";
RepozytoriumOH(Context context) {
super(context, DB_NAME, null, DATABASE_VERSION);
bo np. baza jest tylko
}
na dane tymczasowe
public void onCreate(SQLiteDatabase db) {
i w onUpgrade
db.execSQL("CREATE TABLE ...");
zaniechanie zmian
}
public void onUpgrade(SQLiteDatabase db, int oldVer, int newVer) {
db.execSQL("DROP TABLE IF EXISTS " + "nazwa_tabeli");
onCreate(db);
}
}
© maf 26
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Obsługa SQLite
" Polecenia SQL - zapytania
 Surowe
" Cursor SQLDatabase.rawQuery(String sql, String[]
selectionArgs)
opcjonalne
" SQL select na wielu tabelach
" Akceptują parametry właściwe dla zapytań SQL (specyfikacja tabeli,
projekcja, warunki selekcji, grupowanie itp.)
select ... from ... [where ... order by ... group by ... having ...]
SQLiteDatabase db;
... // otwarcie bazy itp.
zapytanie
String mySQLQuery = "select imie, nazwisko "
+ " from Dane_adresowe "
+ " where wiek > ? "
+ " and miasto = ? ";
String[] myArgs = {"30",  Wroclaw"};
argumenty
(opcjonalne)
Cursor c = db.rawQuery(mySQLQuery, myArgs);
© maf 27
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Obsługa SQLite
" Polecenia SQL - zapytania
Parametryzowane / proste (ang. simple)
" Cursor SQLDatabase.query(String table,
String[] columns,
String selection,
String[] selectionArgs,
String groupBy,
String having,
String orderBy)
String[] columns = {"Oddzial", "Avg(pensja) as AVG"};
String[] condition_args = {"K", "33"};
Cursor c = db.query( "Pracownicy", nazwa tabeli
columns,
kolumny
"plec = ? And wiek > ? " ,
warunek
condition_args,
argumenty warunku
 Oddzial",
grupowanie
"Count(*) > 4",
oddziały od 5 osób
"AVG Desc " );
sortowanie
© maf 28
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Obsługa SQLite
" Cursor
Wyniki zapytań są zwracane w obiekcie typu Cursor
" Ogólnie: dostawca treści udostępnia dane do odczytu w postaci obiektu
zwanego kursorem treści.
" Jest to zbiór krotek (rekordów, wierszy) i kolumn.
Kursor dostarcza mechanizmy pozwalające operować na wyniku
zapytania - nawigować po elementach wyniku (przeglądać rekordy,
kolumny, itd.)
" Kursor jest wstępnie ustawiony przed pierwszą krotką  należy go ustawić
na pierwszÄ… krotkÄ™ metodÄ… moveToFirst
" Do odczytu danych konieczna jest znajomość nazw i typów kolumn w
tabeli dostawcy treści (odczyt: getString, getInt, getFloat, & )
" Metody przesuwania/ustawiania kursora wykorzystujÄ… indeksy kolumn
" Przed odczytem danych należy przekształcić nazwę kolumny w numer
kolumny metodÄ… getColumnIndex (met. odwrotna: getColumnName)
" Kursor można przesuwać do przodu, do tyłu lub ustawiać na dowolną
krotkÄ™: moveToNext, moveToPrevious, moveToFirst,
moveToLast, moveToPosition, move
" Odczyt pozycji: isFirst, isLast, isBeforeFirst, isAfterLast, &
" Odczyt liczby krotek: getCount
© maf 29
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Obsługa SQLite
" Cursor
String [] columns ={"recID", "name", "phone"};
Cursor mojC = db.query("tblAMIGO", columns,
null, null, null, null, "recID");
int idCol = mojC.getColumnIndex("recID");
int nameCol = mojC.getColumnIndex("name");
int phoneCol = mojC.getColumnIndex("phone");
while ( mojC.moveToNext() )
{
columns[0] = Integer.toString((mojC.getInt(idCol)));
columns[1] = myCur.getString(nameCol);
columns[2] = myCur.getString(phoneCol);
txtMsg.append("\n" + columns[0] + " "
+ columns[1] + " "
+ columns[2] );
}
© maf 30
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika
Obsługa SQLite
" Zapis danych poprzez mechanizmy dostawców treści
Dla
mDbHelper = new RepositoryOpenHelper(context);
mDb = mDbHelper.getWritableDatabase();
Dodawanie nowych rekordów
ContentValues initialValues = new ContentValues();
initialValues.put("col1", value);
mDb.insert("table_name", null, initialValues);
" Nowe wartości rekordu są przekazywane w postaci pary (obiekt typu
ContenValues) nazwa_kolumny:wartość.
Aktualizacja wybranego rekordu
ContentValues values = new ContentValues();
initialValues.put("col1", value);
mDb.update("table_name", values, " _id =" + rowId, null);
" W przypadku aktualizacji rekordu należy jeszcze wskazać warunek
wybrania rekordów do aktualizacji. W listingu powyżej wyszukujemy
rekordu o konkretnym ID.
Usunięcie wybranego rekordu
mDb.delete("table_name", "_id =" + rowId, null);
© maf 31
Å›
awska
Å‚
Fra
Wroc
Informatyki
Mariusz
Instytut
Politechnika


Wyszukiwarka

Podobne podstrony:
SWch(full permission)
SWeh(full permission)
SWch(full permission)
SWb(full permission)
SWah(full permission)
SWc(full permission)
SWch(full permission)
SWf(full permission)
SW b(full permission)
SWeh(full permission)
SWeh(full permission)
SWah(full permission)
SWah(full permission)
wyklada ekosystem ziemi(full permission)
7 Prezentacje(full permission)
10 Konstrukcja blachowa(full permission)
5 Dokumentacja płaska(full permission)
wyklada cykl c n s(full permission)
12 Generator ram(full permission)

więcej podobnych podstron