• Uncategorized
  • 0

10.1A: SQLite Database

Task 0. Download and run the starter code

Untuk menghemat pekerjaan, terutama menulis aktivitas database-tidak terkait dan kode antarmuka pengguna, Anda perlu mendapatkan kode starter untuk praktis ini.

  1. Unduh kode starter WordListSqlStarterCode
  2. Buka aplikasi di Android Studio.
  3. Jalankan aplikasinya. Anda harus melihat UI seperti yang ditunjukkan pada tangkapan layar sebelumnya. 

 

Semua kata yang ditampilkan harus "placeholder". Mengklik tombol tidak melakukan apa-apa.



Task 1. Extend SQLiteOpenHelper to create and populate a database

1.1 Create a skeleton WordListOpenHelper class

Buat WordListOpenHelper kelas Java baru dengan tanda tangan berikut.
public class WordListOpenHelper extends SQLiteOpenHelper {}
Di editor kode, arahkan kursor ke kesalahan, lalu klik gambar bohlam dan pilih Terapkan metode. 
Pastikan kedua metode disorot dan klik OK.

Tambahkan konstruktor yang hilang untuk WordListOpenHelper. 
(Anda akan mendefinisikan konstanta yang tidak terdefinisi berikutnya.)

 
 

1.2. Add database constants to WordListOpenHelper

Di bagian atas kelas WordListOpenHelper, tentukan konstanta untuk tabel, baris, dan kolom seperti yang ditunjukkan pada kode di bawah ini. 
Ini harus menyingkirkan semua kesalahan.

1.3. Build the SQL query and code to create the database

Di bawah konstanta, tambahkan kode berikut untuk membuat kueri. Rujuk ke SQLite Primer jika Anda perlu bantuan untuk memahami permintaan ini.

// Build the SQL query that creates the table.
private static final String WORD_LIST_TABLE_CREATE =
       "CREATE TABLE " + WORD_LIST_TABLE + " (" +
               KEY_ID + " INTEGER PRIMARY KEY, " +
               // id will auto-increment if no value passed
               KEY_WORD + " TEXT );";
Tambahkan variabel instan untuk referensi ke database yang bisa ditulis dan dibaca. 
Menyimpan referensi ini akan menghemat Anda untuk mendapatkan referensi basis data setiap kali Anda perlu membaca atau menulis.
private SQLiteDatabase mWritableDB;
private SQLiteDatabase mReadableDB;
Dalam metode onCreate, tambahkan kode untuk membuat database dan tabel (Kelas pembantu tidak membuat database lain, jika sudah ada).
@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(WORD_LIST_TABLE_CREATE);
} Perbaiki kesalahan dengan mengganti nama argumen metode dari SQLiteDatabase ke db.

1.4 Create the database in onCreate of the MainActivity

Untuk membuat database, buat instance dari kelas WordListOpenHelper yang baru saja Anda tulis.

Buka MainActivity.java dan tambahkan variabel instan untuk pembantu terbuka:
private WordListOpenHelper mDB;
Di onCreate, menginisialisasi mDB dengan turunan dari WordListOpenHelper. 
Ini panggilan onCreate dari WordListOpenHelper, yang menciptakan database.
mDB = new WordListOpenHelper(this);

1.5 Add data to the database

buka WordListOpenHelper.java.

Di onCreate, setelah membuat database, tambahkan fungsi call to

fillDatabaseWithData(db);
Selanjutnya, terapkan metode fillDatabaseWithData () di WordListOpenHelper.
Terapkan metode stub
private void fillDatabaseWithData(SQLiteDatabase db){}
Di dalam metode tersebut, nyatakan serangkaian kata sebagai data tiruan Anda.
String[] words = {"Android", "Adapter", "ListView", "AsyncTask",
    "Android Studio", "SQLiteDatabase", "SQLOpenHelper",
    "Data model", "ViewHolder","Android Performance",
    "OnClickListener"};
 Buat penampung untuk data.
// Create a container for the data.
ContentValues values = new ContentValues();
Tambahkan kunci / nilai untuk baris pertama ke nilai, lalu masukkan baris itu ke dalam database. 
Ulangi untuk semua kata dalam susunan kata-kata Anda.
for (int i=0; i < words.length; i++) {
     // Put column/value pairs into the container.
     // put() overrides existing values.
     values.put(KEY_WORD, words[i]);
     db.insert(WORD_LIST_TABLE, null, values);
 }     

Task 2. Create a data model for a single word

2.1. Create a data model for your word data

Buat kelas baru dan beri nama WordItem.

Tambahkan variabel kelas berikut.
private int mId;
private String mWord;
Tambahkan konstruktor kosong.

Tambahkan getter dan setter untuk id dan kata.

Jalankan aplikasi Anda. Anda tidak akan melihat perubahan UI yang terlihat, tetapi seharusnya tidak ada kesalahan.
 

Task 3. Implement the query() method in WordListOpenHelper

3.1. Implement the query() method

Buat metode kueri yang mengambil argumen posisi bilangan bulat dan menghasilkan WordItem.

public WordItem query(int position) {
} Buat query yang mengembalikan hanya baris ke-n dari hasil. Gunakan LIMIT dengan posisi sebagai baris, dan 1 sebagai jumlah baris.
String query = "SELECT  * FROM " + WORD_LIST_TABLE +
                " ORDER BY " + KEY_WORD + " ASC " +
                "LIMIT " + position + ",1"; Instantiasikan sebuah variabel Kursor ke null untuk menyimpan hasil dari database.
Cursor cursor = null; Instantiasikan entri WordItem.
WordItem entry = new WordItem(); Tambahkan try / catch / finally block. 
try {} catch (Exception e) {} finally {} Di dalam blok coba :
dapatkan database yang bisa dibaca jika tidak ada.
if (mReadableDB == null) {
    mReadableDB = getReadableDatabase();
} mengirim permintaan mentah ke database dan menyimpan hasilnya di kursor.
cursor = mReadableDB.rawQuery(query, null);

Pindahkan kursor ke item pertama.
cursor.moveToFirst(); Atur id dan kata dari entri WordItem ke nilai yang dikembalikan oleh kursor.
entry.setId(cursor.getInt(cursor.getColumnIndex(KEY_ID)));
entry.setWord(cursor.getString(cursor.getColumnIndex(KEY_WORD)));

Di blok tangkap, catat pengecualiannya.
Log.d(TAG, "EXCEPTION! " + e);
Di blok terakhir, tutup kursor dan kembalikan entri WordItem.
cursor.close();
return entry;

3.2. The onUpgrade method

Task 4. Display data in the RecyclerView

4.1. Update WordListAdapter to display WordItems

Buka WordListAdapter.

Di onBindViewHolder, ganti kode yang menampilkan data tiruan dengan kode untuk mendapatkan item dari database dan menampilkannya. Anda akan melihat kesalahan pada mDB.

WordItem current = mDB.query(position);
holder.wordItemView.setText(current.getWord()); Deklarasikan mDB sebagai variabel instan.
WordListOpenHelper mDB;
Untuk mendapatkan nilai untuk mDB, ubah konstruktor untuk WordListAdapter dan tambahkan parameter kedua untuk WordListOpenHelper.

Tetapkan nilai parameter ke mDB. Konstruktor Anda akan terlihat seperti ini:
public WordListAdapter(Context context, WordListOpenHelper db) {
        mInflater = LayoutInflater.from(context);
        mContext = context;
        mDB = db;
}
Ini menghasilkan kesalahan dalam MainActivity, karena Anda menambahkan argumen ke konstruktor WordListAdapter. Buka MainActivity dan tambahkan argumen mDB yang hilang. 
mAdapter = new WordListAdapter (this, mDB);

Jalankan aplikasi Anda.     

Task 5. Add new words to the database

5.1. Write the insert() method

di dalam WordListOpenHelper:

Buat metode insert () dengan tanda tangan berikut. Pengguna memberikan kata, dan metode mengembalikan id untuk entri baru. Id yang dihasilkan bisa besar, jadi masukkan mengembalikan sejumlah tipe panjang.

public long insert(String word){}

Deklarasikan variabel untuk id. Jika operasi insert gagal, metode mengembalikan 0.

long newId = 0;

Seperti sebelumnya, buat nilai ContentValues ​​untuk data baris.

ContentValues values = new ContentValues();
values.put(KEY_WORD, word);

Tempatkan operasi basis data Anda menjadi blok coba / tangkap.

try {} catch (Exception e) {}

Dapatkan database yang bisa ditulis jika belum ada.

if (mWritableDB == null) {
    mWritableDB = getWritableDatabase();
}

Masukkan baris.

newId = mWritableDB.insert(WORD_LIST_TABLE, null, values);

Catat pengecualiannya.

Log.d(TAG, "INSERT EXCEPTION! " + e.getMessage());

Kembalikan idnya.

return newId; 

5.2. Get the word to insert from the user and update the database

Kode starter dilengkapi dengan EditWordActivity yang mendapat kata dari pengguna dan mengembalikannya ke aktivitas utama. Di MainActivity, Anda hanya perlu mengisi metode onActivityResult ().

Periksa untuk memastikan hasilnya dari aktivitas yang benar dan dapatkan kata yang dimasukkan pengguna dari ekstra.
if (requestCode == WORD_EDIT) {
   if (resultCode == RESULT_OK) {
        String word = data.getStringExtra(EditWordActivity.EXTRA_REPLY);
Jika kata tidak kosong, periksa apakah kami telah lulus id dengan ekstra. 
Jika tidak ada id, masukkan kata baru. Di tugas berikutnya, Anda akan memperbarui kata yang ada jika sebuah ID dilewatkan.
if (!TextUtils.isEmpty(word)) {
    int id = data.getIntExtra(WordListAdapter.EXTRA_ID, -99);
    if (id == WORD_ADD) {
        mDB.insert(word);
}
Untuk memperbarui UI, beri tahu adaptor bahwa data yang mendasarinya telah berubah.
mAdapter.notifyDataSetChanged();
Jika kata kosong karena pengguna tidak memasukkan apa pun, tunjukkan berulang untuk memberi tahu mereka. Dan jangan lupa tutup semua tanda kurung.
} else {
    Toast.makeText(
        getApplicationContext(),
        R.string.empty_not_saved,
        Toast.LENGTH_LONG).show();
        }
     }
}

5.3. Implement getItemCount()

Ubah getItemCount ke kode di bawah ini, yang akan memicu kesalahan.
return (int) mDB.count();
Buka WordListOpenHelper dan implement count () untuk mengembalikan jumlah entri dalam database. 
public long count(){
    if (mReadableDB == null) {
        mReadableDB = getReadableDatabase();
    }
    return DatabaseUtils.queryNumEntries(mReadableDB, WORD_LIST_TABLE);
}
Jalankan aplikasi Anda dan tambahkan beberapa kata.  

Task 6. Delete words from the database

6.1. Write the delete() method

Buat stub metode untuk delete (), yang mengambil argumen int untuk id dari item yang dihapus, dan mengembalikan jumlah baris yang dihapus.

public int delete(int id) {}

Deklarasikan variabel untuk menahan hasilnya.

int deleted = 0;

Untuk memasukkan, tambahkan blok coba.

try {} catch (Exception e) {}

Dapatkan database yang bisa ditulis, jika perlu.

Panggil hapus pada WORD_LIST_TABLE, pilih oleh KEY_ID dan teruskan nilai id sebagai argumen. “?” adalah placeholder yang diisi dengan string. Ini adalah cara yang lebih aman untuk membuat kueri.

Cetak pesan log untuk pengecualian.

Kembalikan jumlah baris yang dihapus.

6.2. Add a click handler to DELETE button

Task 7. Update words in the database

Untuk memperbarui kata-kata yang ada, Anda harus:

Tambahkan metode pembaruan () ke WordListOpenHelper.

Tambahkan handler klik ke tombol EDIT dari pandangan Anda.

7.1. Write the update() method

Anda menggunakan metode update () pada SQLiteDatabase untuk memperbarui entri yang ada dalam database.

Tambahkan metode ke WordListOpenHelper yang:

Mengambil id integer dan kata String untuk argumennya dan mengembalikan integer.
public int update(int id, String word)
Inisialisasi int mNumberOfRowsUpdated ke -1.
int mNumberOfRowsUpdated = -1;
Di dalam blok coba, lakukan langkah-langkah berikut: 
Dapatkan SQLiteDatabase db yang dapat ditulis jika belum ada.
if (mWritableDB == null) {
    mWritableDB = getWritableDatabase();
}

Buat instance baru ContentValues ​​dan kata KEY_WORD untuk itu. 
ContentValues values = new ContentValues();
values.put(KEY_WORD, word);

Panggil db.update menggunakan argumen berikut:
mNumberOfRowsUpdated = db.update(WORD_LIST_TABLE,
       values, // new values to insert
       // selection criteria for row (the _id column)
       KEY_ID + " = ?",
       //selection args; value of id
       new String[]{String.valueOf(id)});

Di blok tangkap, cetak pesan log jika ada pengecualian yang ditemukan. 
Log.d (TAG, "UPDATE EXCEPTION: " + e.getMessage());

Kembalikan jumlah baris yang diperbarui, yang seharusnya menjadi -1 (gagal), 0 (tidak ada yang diperbarui), atau 1 (berhasil).
return mNumberOfRowsUpdated;

7.2. Add a click listener to the EDIT button

7.3. Add updating to onActivityResult

Seperti yang diterapkan, pengeditan klik memulai aktivitas yang menunjukkan pengguna kata saat ini, dan mereka dapat mengeditnya. Untuk membuat pembaruan terjadi,

Tambahkan satu baris kode ke metode onActivityResult di MainActivity Anda.
else if (id >= 0) {
    mDB.update(id, word);
}
Jalankan aplikasi Anda dan mainkan dengan itu!

 

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *