642
Rozdział 15.
Aktualizacja bazy danych
Zaktualizujmy bazę danych
Załóżmy, że musimy zaktualizować naszą bazę danych, a konkretnie dodać do
tabeli
DRINK
nową kolumnę. Ponieważ chcemy, by zmiana ta trafiła do wszystkich
użytkowników aplikacji, i obecnych, i przyszłych, musimy zadbać o to, by uwzględnić ją
zarówno w metodzie
onUpdate()
, jak i w metodzie
onCreate()
. Metoda
onCreate()
sprawi, że nowi użytkownicy aplikacji będą dysponowali bazą z dodatkową kolumną,
natomiast metoda
onUpdate()
wprowadzi niezbędną modyfikację u użytkowników,
którzy już wcześniej zainstalowali aplikację.
Zamiast umieszczać podobny kod w obu metodach,
onCreate()
i
onUpdate()
,
napiszemy nową metodę,
updateMyDatabase()
, a następnie wywołamy ją w obu
metodach,
onCreate()
i
onUpdate()
. Do metody
updateMyDatabase()
przeniesiemy
aktualny kod metody
onCreate()
, a oprócz tego uzupełnimy go o kod tworzący
dodatkową kolumnę. Dzięki takiemu rozwiązaniu będziemy w stanie umieścić cały kod
związany z tworzeniem bazy danych w jednym miejscu i łatwiej nam będzie zapanować
nad zmianami wprowadzanymi w każdej kolejnej wersji bazy danych.
Poniżej przedstawiliśmy kompletny kod pliku
CoffeinaDatabaseHelper.java
(zaktualizuj kod tego pliku w swoim projekcie, tak by był identyczny z naszym).
¨
Aktualizacja bazy danych
app/src/main
CoffeinaDatabase
Helper.java
Coffeina
java
com.hfad.coffeina
package com.hfad.starbuzz;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
class StarbuzzDatabaseHelper extends SQLiteOpenHelper{
private static final String DB_NAME = ”coffeina”; // Nazwa bazy danych
private static final int DB_VERSION = 12; // Numer wersji bazy danych
StarbuzzDatabaseHelper(Context context){
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db){
updateMyDatabase(db, 0, DB_VERSION);
}
Zastąp istniejący kod metody
onCreate() tym wywołaniem
metody updateMyDatabase().
Zmiana numeru wersji na większy oznacza,
że pomocnik SQLite będzie wiedzieć,
że chcemy zaktualizować bazę danych.
Pozostała
część kodu
znajduje
się na
następnej
stronie.
Bazy danych SQLite
643
jesteś tutaj
package com.hfad.starbuzz;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
class StarbuzzDatabaseHelper extends SQLiteOpenHelper{
private static final String DB_NAME = ”coffeina”; // Nazwa bazy danych
private static final int DB_VERSION = 12; // Numer wersji bazy danych
StarbuzzDatabaseHelper(Context context){
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db){
updateMyDatabase(db, 0, DB_VERSION);
}
¨
Aktualizacja bazy danych
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
updateMyDatabase(db, oldVersion, newVersion);
}
private static void insertDrink(SQLiteDatabase db, String name,
String description, int resourceId) {
ContentValues drinkValues = new ContentValues();
drinkValues.put(”NAME”, name);
drinkValues.put(”DESCRIPTION”, description);
drinkValues.put(”IMAGE_RESOURCE_ID”, resourceId);
db.insert(”DRINK”, null, drinkValues);
}
private void updateMyDatabase(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion < 1) {
db.execSQL(“CREATE TABLE DRINK (_id INTEGER PRIMARY KEY AUTOINCREMENT, “
+ “NAME TEXT, “
+ “DESCRIPTION TEXT, “
+ “IMAGE_RESOURCE_ID INTEGER);”);
insertDrink(db, “Latte”,
“Czarne espresso z gorącym mlekiem i mleczną pianką.”,
R.drawable.latte);
insertDrink(db, “Cappuccino”,
“Czarne espresso z dużą ilością spienionego mleka.”,
R.drawable.cappuccino);
insertDrink(db, “Espresso”,
“Czarna kawa ze świeżo mielonych ziaren najwyższej jakości.”,
R.drawable.filter);
}
if (oldVersion < 2) {
// Kod dodający nową kolumnę tabeli
}
}
}
app/src/main
CoffeinaDatabase
Helper.java
Coffeina
java
com.hfad.coffeina
To kod, który
wcześniej był
umieszczony
w metodzie
onCreate().
Wywołujemy metodę updateMyDatabase()
w metodzie onUpgrade(), przekazując do
niej odpowiednie parametry.
Ten kod zostanie wywołany
w przypadku, gdy użytkownik
już dysponuje pierwszą wersją
bazy danych. Już niebawem
zaimplementujemy ten kod.
Kod pomocnika SQLite (ciąg dalszy)
Kolejną rzeczą, którą musimy zrobić, jest napisanie kodu
odpowiedzialnego za wykonanie aktualizacji bazy danych.
Jednak zanim się tym zajmiemy, spróbuj wykonać ćwiczenie
zamieszczone na następnej stronie.
644
Rozdział 15.
Ćwiczenie
Wczuj się w pomocnika SQLite
Z prawej strony zamieściliśmy kod
pomocnika SQLite. Twoim zadaniem jest
wcielić się w rolę tego pomocnika
i określić, które fragmenty
kodu zostaną wykonane
dla poszczególnych,
przedstawionych poniżej
użytkowników. Kod, na
którym powinieneś się skoncentrować,
zaznaczyliśmy literami. Aby ułatwić
Ci rozwiązanie ćwiczenia, pierwszą
odpowiedź podaliśmy za Ciebie.
...
class MyHelper extends SQLiteOpenHelper{
StarbuzzDatabaseHelper(Context context){
super(context, “kamerdyner”, null, 4);
}
@Override
public void onCreate(SQLiteDatabase db){
// Wykonanie fragmentu kodu A
...
}
@Override
public void onUpgrade(SQLiteDatabase db,
int oldVersion,
int newVersion){
if (oldVersion < 2) {
// Wykonanie fragmentu kodu B
...
}
if (oldVersion == 3) {
// Wykonanie fragmentu kodu C
...
}
// Wykonanie fragmentu kodu D
...
}
@Override
public void onDowngrade(SQLiteDatabase db,
int oldVersion,
int newVersion){
if (oldVersion == 3) {
// Wykonanie fragmentu kodu E
...
}
if (oldVersion < 6) {
// Wykonanie fragmentu kodu F
...
}
}
}
A
F
E
D
C
B
Użytkownik 1. uruchamia aplikację
po raz pierwszy.
Użytkownik 2. dysponuje bazą danych
o numerze wersji 1.
Użytkownik 3. dysponuje bazą danych
o numerze wersji 2.
Użytkownik 4. dysponuje bazą danych
o numerze wersji 3.
Użytkownik 5. dysponuje bazą danych
o numerze wersji 4.
Użytkownik 6. dysponuje bazą danych
o numerze wersji 5.
Fragment kodu A. Na urządzeniu użytkownika
nie ma jeszcze bazy danych, dlatego wykonywana
jest metoda onCreate().
Odpowiedzi na s. 654
Get Android Programowanie aplikacji. Rusz głową! Wydanie II now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.