732
Rozdział 17.
Kod aktywności DrinkActivity
package com.hfad.coffeina;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.view.View;
import android.widget.CheckBox;
import android.content.ContentValues;
import android.os.AsyncTask;
public class DrinkActivity extends Activity {
public static final String EXTRA_DRINKID = ”drinkId”;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_drink);
// Pobieramy identyfikator napoju z intencji
int drinkId = (Integer) getIntent().getExtras().get(EXTRA_DRINKID);
// Tworzymy kursor
SQLiteOpenHelper coffeinaDatabaseHelper = new CoffeinaDatabaseHelper(this);
try {
SQLiteDatabase db = coffeinaDatabaseHelper.getReadableDatabase();
Cursor cursor = db.query(”DRINK”,
new String[]{”NAME”, ”DESCRIPTION”, ”IMAGE_RESOURCE_ID”,”FAVORITE”},
”_id = ?”,
new String[]{Integer.toString(drinkId)},
null, null, null);
Kompletny kod pliku DrinkActivity.java
Poniżej przedstawiliśmy kompletny kod pliku DrinkActivity.java;
zaktualizuj swoją wersję tego pliku, tak by była identyczna z naszą:
app/src/main
DrinkActivity.java
Coffeina
java
com.hfad.coffeina
Używamy klasy AsyncTask, więc musimy ją zaimportować.
Nie trzeba zmieniać kodu metody onCreate(),
zamieściliśmy ją jednak, by pokazać cały kod klasy.
Dalsza część kodu
znajduje się na
następnej stronie.
Kursory i zadania asynchroniczne
733
jesteś tutaj
app/src/main
DrinkActivity.java
Coffeina
java
com.hfad.coffeina
// Przechodzimy do pierwszego rekordu w kursorze
if (cursor.moveToFirst()) {
// Pobieramy z kursora szczegółowe informacje o napoju
String nameText = cursor.getString(0);
String descriptionText = cursor.getString(1);
int photoId = cursor.getInt(2);
boolean isFavorite = (cursor.getInt(3) == 1);
// Wyświetlamy nazwę napoju
TextView name = (TextView) findViewById(R.id.name);
name.setText(nameText);
// Wyświetlamy opis napoju
TextView description = (TextView) findViewById(R.id.description);
description.setText(descriptionText);
// Wyświetlamy zdjęcie napoju
ImageView photo = (ImageView) findViewById(R.id.photo);
photo.setImageResource(photoId);
photo.setContentDescription(nameText);
// Zaznaczamy pole wyboru ulubionego napoju
CheckBox favorite = (CheckBox)findViewById(R.id.favorite);
favorite.setChecked(isFavorite);
}
cursor.close();
db.close();
} catch (SQLiteException e) {
Toast toast = Toast.makeText(this,
”Baza danych jest niedostępna”,
Toast.LENGTH_SHORT);
toast.show();
}
}
Kompletny kod pliku DrinkActivity.java (ciąg dalszy)
W kodzie przedstawionym
na tej stronie nie trzeba
nic zmieniać.
Dalsza część kodu
znajduje się na
następnej stronie.
734
Rozdział 17.
Ciąg dalszy kodu
// Aktualizujemy bazę po zaznaczeniu pola wyboru
public void onFavoriteClicked(View view){
int drinkId = (Integer) getIntent().getExtras().get(EXTRA_DRINKID);
// Pobieramy wartość pola wyboru
CheckBox favorite = (CheckBox) findViewById(R.id.favorite);
ContentValues drinkValues = new ContentValues();
drinkValues.put(”FAVORITE”, favorite.isChecked());
// Pobieramy referencję do bazy danych i aktualizujem kolumnę FAVORITE
SQLiteOpenHelper coffeinaDatabaseHelper =
new CoffeinaDatabaseHelper(this);
try {
SQLiteDatabase db = coffeinaDatabaseHelper.getWritableDatabase();
db.update(”DRINK”,
drinkValues,
”_id = ?”,
new String[] {Integer.toString(drinkId)});
db.close();
} catch(SQLiteException e) {
Toast toast = Toast.makeText(this, ”Baza danych jest niedostępna”, Toast.LENGTH_SHORT);
toast.show();
}
new UpdateDrinkTask().execute(drinkId);
}
Dalsza część kodu
znajduje się na
następnej stronie.
Wykonujemy zadanie.
Usuń wszystkie te wiersze
— te operacje wykonujemy
obecnie w obiekcie AsyncTask.
Kompletny kod pliku DrinkActivity.java (ciąg dalszy)
app/src/main
DrinkActivity.java
Coffeina
java
com.hfad.coffeina
Kursory i zadania asynchroniczne
735
jesteś tutaj
// Klasa wewnętrzna służąca do aktualizacji danych napoju
private class UpdateDrinkTask extends AsyncTask<Integer, Void, Boolean> {
private ContentValues drinkValues;
protected void onPreExecute() {
CheckBox favorite = (CheckBox) findViewById(R.id.favorite);
drinkValues = new ContentValues();
drinkValues.put(“FAVORITE”, favorite.isChecked());
}
protected Boolean doInBackground(Integer... drinks) {
int drinkId = drinks[0];
SQLiteOpenHelper coffeinaDatabaseHelper =
new CoffeinaDatabaseHelper(DrinkActivity.this);
try {
SQLiteDatabase db = coffeinaDatabaseHelper.getWritableDatabase();
db.update(“DRINK”, drinkValues,
“_id = ?”, new String[] {Integer.toString(drinkId)});
db.close();
return true;
} catch(SQLiteException e) {
return false;
}
}
protected void onPostExecute(Boolean success) {
if (!success) {
Toast toast = Toast.makeText(DrinkActivity.this,
“Baza danych jest niedostępna”, Toast.LENGTH_SHORT);
toast.show();
}
}
}
}
To już wszystko, co musisz zrobić, by utworzyć i wykonać obiekt
AsyncTask
.
Sprawdźmy, co się stanie, kiedy uruchomimy aplikację.
Dodajemy klasę AsyncTask do aktywności
jako klasę wewnętrzną.
Przed wykonaniem kodu operującego na bazie
danych zapisujemy wartość pola wyboru
w obiekcie ContentValue przechowywanym
w zmiennej drinkValues.
Wykonujemy kod operujący
na bazie danych w tle.
Aktualizujemy kolumnę
FAVORITE.
Jeśli operacje na bazie danych nie zostały
wykonane prawidłowo, to wyświetlamy
stosowny komunikat.
Kompletny kod pliku DrinkActivity.java (ciąg dalszy)
DrinkActivity.java
app/src/main
DrinkActivity.java
Coffeina
java
com.hfad.coffeina
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.