0. Tworzymy projekt BazaDanychSQLite z Empty Activity o nazwie MainActivity. 1. Modyfikujemy plik activity_main.xml nadając id kontrolce TextView, zmieniając położenie i wielkość czcionki: 2. Do projektu dodajemy klasę BazaDanychOsób dziedziczącą z android.database.sqlite.SQLiteOpenHelper (osobny plik BazaDanychOsób.java). Zaznaczmy pole Show Select Override Dialog. Do nadpisania zaznaczmy: konstruktor, OnCreate i OnUpdate. 3. Modyfikujemy konstruktor tak, żeby przyjmował tylko jeden argument. Do OnCreate wpisujemy polecenie tworzące tabelę. package pl.umk.fizyka.bazadanychsqlite; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class BazaDanychOsób extends SQLiteOpenHelper { public BazaDanychOsób(Context context) { super(context, "osoby.db", null, 1); } @Override public void onCreate(SQLiteDatabase db) { //tworzenie bazy } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //zmiana wersji } } version - numer struktury bazy danych (rekordu i tabel), należy go zwiększać przy zmianach w strukturze bazy OnCreate - wywoływana przy tworzeniu pliku (po pierwszym uruchomieniu) OnUpgrade - aktualizacja wersji bazy danych 4. Definiujemy klasę opisującą rekord w tabeli: class Osoba { final static String nazwaTabeli = "osoby"; final static String[] nazwyKolumnTabeli = {"ID","Imię","Nazwisko","Wiek","NumerTelefonu"}; final static String[] własnościKolumnTabeli = {"INTEGER PRIMARY KEY", "TEXT", "TEXT", "INTEGER", "INTEGER"}; final static String nazwaBazyDanych = nazwaTabeli + ".db"; int ID; String Imię; String Nazwisko; int Wiek; int NumerTelefonu; public Osoba(int id, String imię, String nazwisko, int wiek, int numerTelefonu) { this.ID = id; this.Imię = imię; this.Nazwisko = nazwisko; this.Wiek = wiek; this.NumerTelefonu = numerTelefonu; } @Override public String toString() { return "" + ID + ") " + Imię + " " + Nazwisko + " (" + Wiek + "), tel. " + NumerTelefonu; } } 5. Piszemy i wykonujemy polecenie tworzące tabelę w bazie danych: public class BazaDanychOsób extends SQLiteOpenHelper { public BazaDanychOsób(Context context) { super(context, Osoba.nazwaBazyDanych, null, 1); } @Override public void onCreate(SQLiteDatabase db) { String createCommand = "create table " + Osoba.nazwaTabeli + "("; for(int numerKolumny = 0; numerKolumny < Osoba.nazwyKolumnTabeli.length; ++numerKolumny) { String nazwaKolumny = Osoba.nazwyKolumnTabeli[numerKolumny]; String własnościKolumny = Osoba.własnościKolumnTabeli[numerKolumny]; createCommand += nazwaKolumny + " " + własnościKolumny + ","; } createCommand = createCommand.substring(0, createCommand.length() - 1); createCommand += ")"; db.execSQL(createCommand); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //zmiana wersji } } 6. W klasie BazaDanychOsób definiujemy metody pozwalającą na dodanie rekordu do tabeli: private ContentValues wartościZOsoby(Osoba osoba) { ContentValues wartości = new ContentValues(); wartości.put(Osoba.nazwyKolumnTabeli[0], osoba.ID); wartości.put(Osoba.nazwyKolumnTabeli[1], osoba.Imię); wartości.put(Osoba.nazwyKolumnTabeli[2], osoba.Nazwisko); wartości.put(Osoba.nazwyKolumnTabeli[3], osoba.Wiek); wartości.put(Osoba.nazwyKolumnTabeli[4], osoba.NumerTelefonu); return wartości; } public void dodajRekord(Osoba osoba) { SQLiteDatabase db = getWritableDatabase(); ContentValues wartości = wartościZOsoby(osoba); db.insertOrThrow(Osoba.nazwaTabeli, null, wartości); } 7. ... i pobranie wszystkich rekordów private Osoba osobaZKaretki(Cursor karetka) { Osoba osoba = new Osoba( karetka.getInt(0), //ID karetka.getString(1), //Imię karetka.getString(2), //Nazwisko karetka.getInt(3), //Wiek karetka.getInt(4)); //NumerTelefonu return osoba; } public Osoba[] pobierzWszystkieRekordy(String orderBy) { SQLiteDatabase db = getReadableDatabase(); Cursor karetka = db.query(Osoba.nazwaTabeli, Osoba.nazwyKolumnTabeli, null, null, null, null, orderBy); ArrayList lista = new ArrayList(); while(karetka.moveToNext()) { lista.add(osobaZKaretki(karetka)); } karetka.close(); Osoba[] tablica = new Osoba[lista.size()]; lista.toArray(tablica); return tablica; } public Osoba[] pobierzWszystkieRekordy() { return pobierzWszystkieRekordy(null); } 8. Testujemy w klasie MainActivity: public class MainActivity extends AppCompatActivity { public void pokażOsoby(Osoba[] osoby) { TextView tv = (TextView) findViewById(R.id.textView); //tv.setText(Integer.toString(osoby.length)); String sRekordy = "Rekordy:"; for (Osoba osoba : osoby) sRekordy += "\n" + osoba.toString(); tv.setText(sRekordy); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //usuwam bazę danych - ma sens tylko do nauki boolean wynik = this.deleteDatabase(Osoba.nazwaBazyDanych); Toast.makeText(getApplicationContext(), "Usunięcie bazy danych: " + Boolean.toString(wynik), Toast.LENGTH_SHORT).show(); //tworzę bazę danych i dodaję rekordy BazaDanychOsób dbm = new BazaDanychOsób(this); dbm.dodajRekord(new Osoba(0, "Jacek", "Matulewski", 45, 123456789)); dbm.dodajRekord(new Osoba(1, "Jan", "Kowalski", 46, 987654321)); dbm.dodajRekord(new Osoba(2, "John", "Smith", 20, 987654321)); dbm.dodajRekord(new Osoba(3, "Hans", "Muller", 32, 564738219)); //dbm.dodajRekord(new Osoba(0, "Jacek2", "Matulewski2", 32, 564738219)); //czytam zawartość bazy danych Osoba[] osoby = dbm.pobierzWszystkieRekordy("Imię"); pokażOsoby(osoby); } } 8. Zadanie dla studentów: Implementacja metody pozwalającej na pobranie rekordu po ID public Osoba pobierzRekord(int ID) 9. Implementujemy w klasie BazaDanychOsób resztę operacji CRUD dla rekordów public boolean usuńRekordy(int id) { SQLiteDatabase db = getWritableDatabase(); String[] whereArgs = { Integer.toString(id) }; return db.delete(Osoba.nazwaTabeli, "ID=?", whereArgs) > 0; } public boolean zmieńRekord(int id, Osoba osoba) { SQLiteDatabase db = getWritableDatabase(); ContentValues wartości = wartościZOsoby(osoba); String[] whereArgs = { Integer.toString(id) }; return db.update(Osoba.nazwaTabeli, wartości, "ID=?", whereArgs) > 0; } 10. Testy w klasie MainActivity: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //usuwam bazę danych - ma sens tylko do nauki boolean wynik = this.deleteDatabase(Osoba.nazwaBazyDanych); Toast.makeText(getApplicationContext(), "Usunięcie bazy danych: " + Boolean.toString(wynik), Toast.LENGTH_SHORT).show(); //tworzę bazę danych i dodaję rekordy BazaDanychOsób dbm = new BazaDanychOsób(this); dbm.dodajRekord(new Osoba(0, "Jacek", "Matulewski", 45, 123456789)); dbm.dodajRekord(new Osoba(1, "Jan", "Kowalski", 46, 987654321)); dbm.dodajRekord(new Osoba(2, "John", "Smith", 20, 987654321)); dbm.dodajRekord(new Osoba(3, "Hans", "Muller", 32, 564738219)); //dbm.dodajRekord(new Osoba(0, "Jacek2", "Matulewski2", 32, 564738219)); //czytam zawartość bazy danych Osoba[] osoby = dbm.pobierzWszystkieRekordy("Imię"); pokażOsoby(osoby); dbm.usuńRekordy(1); osoby = dbm.pobierzWszystkieRekordy(null); pokażOsoby(osoby); dbm.zmieńRekord(0, new Osoba(4, "Jean", "Dupont", 50, 1230198318)); osoby = dbm.pobierzWszystkieRekordy("Imię"); pokażOsoby(osoby); //dbm.close(); } 11. Zadanie - zrobić BazaDanych - opakowanie dla klasy rekordu