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