Bagian pelajaran ini mengajarkan Anda cara
- Mendefinisikan Skema dan Kontrak
- Membuat Database Menggunakan SQL Helper
- Memasukkan Informasi ke Database
- Membaca Informasi dari Database
- Menghapus Informasi dari Database
- Memperbarui Database
Anda juga harus membaca
Menyimpan data ke database cocok untuk data terstruktur atau berulang,
misalnya informasi kontak. Kelas ini beranggapan bahwa Anda
telah menguasai database SQL secara umum dan membantu Anda memulai
database SQLite di Android. API yang nanti Anda perlukan untuk menggunakan database
di Android tersedia dalam paket android.database.sqlite.
Mendefinisikan Skema dan Kontrak
Salah satu prinsip utama database SQL adalah skema: deklarasi formal mengenai cara menata database. Skema ini tercermin dalam pernyataan SQL yang Anda gunakan untuk membuat database. Anda akan merasakan gunanya saat membuat kelas pendamping, yang disebut dengan kelas kontrak, yang menetapkan secara eksplisit layout skema Anda dengan cara sistematis dan terdokumentasikan sendiri.
Kelas kontrak adalah kontainer untuk konstanta yang mendefinisikan nama untuk URI, tabel, dan kolom. Kelas kontrak memungkinkan Anda menggunakan konstanta yang sama di semua kelas lainnya dalam paket yang sama. Hal ini memungkinkan Anda mengubah nama kolom di satu tempat dan menyebarkannya ke seluruh kode Anda.
Cara yang baik untuk menata kelas kontrak adalah menempatkan definisi yang bersifat global ke seluruh database Anda di tingkat akar kelas itu. Kemudian buat sebuah kelas sisipan untuk setiap tabel yang menghitung kolom-kolomnya.
Catatan: Dengan mengimplementasikan antarmuka BaseColumns, kelas sisipan bisa mewarisi
bidang kunci utama bernama _ID yang diharapkan untuk dimiliki oleh beberapa
kelas Android seperti adaptor kursor. Hal ini tidak disyaratkan, namun bisa membantu database Anda
untuk bekerja harmonis dengan kerangka kerja Android.
Misalnya, cuplikan ini mendefinisikan nama tabel dan nama kolom untuk tabel tunggal:
public final class FeedReaderContract {
// To prevent someone from accidentally instantiating the contract class,
// make the constructor private.
private FeedReaderContract() {}
/* Inner class that defines the table contents */
public static class FeedEntry implements BaseColumns {
public static final String TABLE_NAME = "entry";
public static final String COLUMN_NAME_TITLE = "title";
public static final String COLUMN_NAME_SUBTITLE = "subtitle";
}
}
Membuat Database Menggunakan SQL Helper
Setelah mendefinisikan penampilan database, Anda harus mengimplementasikan metode yang membuat dan memelihara database dan tabel. Inilah beberapa pernyataan umum yang membuat dan menghapus tabel:
private static final String TEXT_TYPE = " TEXT";
private static final String COMMA_SEP = ",";
private static final String SQL_CREATE_ENTRIES =
"CREATE TABLE " + FeedEntry.TABLE_NAME + " (" +
FeedEntry._ID + " INTEGER PRIMARY KEY," +
FeedEntry.COLUMN_NAME_TITLE + TEXT_TYPE + COMMA_SEP +
FeedEntry.COLUMN_NAME_SUBTITLE + TEXT_TYPE + " )";
private static final String SQL_DELETE_ENTRIES =
"DROP TABLE IF EXISTS " + FeedEntry.TABLE_NAME;
Persis seperti file yang Anda simpan pada penyimpanan internal perangkat, Android menyimpan database Anda di ruang disk privat yang terkait dengan aplikasi. Data Anda akan aman, karena secara default area ini tidak bisa diakses aplikasi lain.
Serangkaian API berguna tersedia di kelas SQLiteOpenHelper.
Bila Anda menggunakan kelas ini untuk memperoleh referensi ke database, sistem akan
melakukan operasi pembuatan dan pembaruan database
yang berpotensi berjalan lama hanya bila
diperlukan dan tidak selama memulai aplikasi. Yang perlu Anda lakukan hanyalah memanggil
getWritableDatabase() atau
getReadableDatabase().
Catatan: Karena itu berjalan lama,
pastikan Anda memanggil getWritableDatabase() atau getReadableDatabase() di thread latar belakang,
misalnya dengan AsyncTask atau IntentService.
Untuk menggunakan SQLiteOpenHelper, buat subkelas yang
mengganti onCreate(), onUpgrade() dan metode callback onOpen() . Anda juga mungkin
perlu mengimplementasikan onDowngrade(),
namun itu tidak diharuskan.
Misalnya, inilah implementasi SQLiteOpenHelper yang menggunakan beberapa perintah yang ditampilkan di atas:
public class FeedReaderDbHelper extends SQLiteOpenHelper {
// If you change the database schema, you must increment the database version.
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "FeedReader.db";
public FeedReaderDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL_CREATE_ENTRIES);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// This database is only a cache for online data, so its upgrade policy is
// to simply to discard the data and start over
db.execSQL(SQL_DELETE_ENTRIES);
onCreate(db);
}
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
onUpgrade(db, oldVersion, newVersion);
}
}
Untuk mengakses database, buat instance subkelas SQLiteOpenHelper:
FeedReaderDbHelper mDbHelper = new FeedReaderDbHelper(getContext());
Memasukkan Informasi ke Database
Sisipkan data ke dalam database dengan meneruskan objek ContentValues
ke metode insert():
// Gets the data repository in write mode SQLiteDatabase db = mDbHelper.getWritableDatabase(); // Create a new map of values, where column names are the keys ContentValues values = new ContentValues(); values.put(FeedEntry.COLUMN_NAME_TITLE, title); values.put(FeedEntry.COLUMN_NAME_SUBTITLE, subtitle); // Insert the new row, returning the primary key value of the new row long newRowId = db.insert(FeedEntry.TABLE_NAME, null, values);
Argumen pertama untuk insert()
adalah sekadar nama tabel.
Argumen kedua memberitahu kerangka kerja apa yang perlu dilakukan dalam kejadian
ContentValues kosong (yaitu Anda tidak memasukkan
put nilai apa pun).
Jika Anda menetapkan nama kolom, kerangka kerja menyisipkan satu baris dan menetapkan
nilai kolom nol. Jika Anda menetapkan null, seperti dalam
sampel kode ini, kerangka kerja tidak menyisipkan baris saat tidak ada nilai.
Membaca Informasi dari Database
Untuk membaca dari database, gunakan metode query()
, dengan meneruskan kriteria pemilihan dan kolom yang diinginkan.
Metode ini menggabungkan elemen insert()
dan update(), kecuali daftar kolom
mendefinisikan data yang ingin Anda ambil, bukannya data yang akan disisipkan. Hasil kueri
dikembalikan kepada Anda dalam objek Cursor.
SQLiteDatabase db = mDbHelper.getReadableDatabase();
// Define a projection that specifies which columns from the database
// you will actually use after this query.
String[] projection = {
FeedEntry._ID,
FeedEntry.COLUMN_NAME_TITLE,
FeedEntry.COLUMN_NAME_SUBTITLE
};
// Filter results WHERE "title" = 'My Title'
String selection = FeedEntry.COLUMN_NAME_TITLE + " = ?";
String[] selectionArgs = { "My Title" };
// How you want the results sorted in the resulting Cursor
String sortOrder =
FeedEntry.COLUMN_NAME_SUBTITLE + " DESC";
Cursor c = db.query(
FeedEntry.TABLE_NAME, // The table to query
projection, // The columns to return
selection, // The columns for the WHERE clause
selectionArgs, // The values for the WHERE clause
null, // don't group the rows
null, // don't filter by row groups
sortOrder // The sort order
);
Untuk melihat baris dalam kursor, gunakan salah satu metode move Cursor,
yang harus selalu Anda panggil sebelum mulai membaca nilai. Umumnya, Anda harus mulai
dengan memanggil moveToFirst(), yang menempatkan “posisi baca” pada
entri pertama dalam hasil. Untuk setiap baris, Anda bisa membaca nilai kolom dengan memanggil salah satu
metode get Cursor, misalnya getString() atau getLong(). Untuk setiap metode get,
Anda harus meneruskan posisi indeks kolom yang diinginkan, yang bisa Anda dapatkan dengan memanggil
getColumnIndex() atau
getColumnIndexOrThrow().
Misalnya:
cursor.moveToFirst();
long itemId = cursor.getLong(
cursor.getColumnIndexOrThrow(FeedEntry._ID)
);
Menghapus Informasi dari Database
Untuk menghapus baris dari tabel, Anda perlu memberikan kriteria pemilihan yang mengidentifikasi baris tersebut. API database menyediakan mekanisme untuk membuat kriteria pemilihan yang melindungi terhadap injeksi SQL. Mekanisme ini membagi spesifikasi pemilihan ke dalam satu klausa pemilihan dan beberapa argumen pemilihan. Klausa ini mendefinisikan kolom-kolom yang harus dilihat, juga memungkinkan Anda untuk menggabungkan pengujian kolom. Argumen adalah nilai-nilai yang harus diuji terhadap nilai yang terikat ke dalam klausa. Karena hasilnya tidak ditangani sama dengan pernyataan SQL biasa, hasil akan kebal terhadap injeksi SQL.
// Define 'where' part of query.
String selection = FeedEntry.COLUMN_NAME_TITLE + " LIKE ?";
// Specify arguments in placeholder order.
String[] selectionArgs = { "MyTitle" };
// Issue SQL statement.
db.delete(FeedEntry.TABLE_NAME, selection, selectionArgs);
Memperbarui Database
Bila Anda perlu memodifikasi subset nilai database, gunakan metode update().
Pembaruan tabel akan menggabungkan sintaks nilai materi insert()dengan sintaks where
delete().
SQLiteDatabase db = mDbHelper.getReadableDatabase();
// New value for one column
ContentValues values = new ContentValues();
values.put(FeedEntry.COLUMN_NAME_TITLE, title);
// Which row to update, based on the title
String selection = FeedEntry.COLUMN_NAME_TITLE + " LIKE ?";
String[] selectionArgs = { "MyTitle" };
int count = db.update(
FeedReaderDbHelper.FeedEntry.TABLE_NAME,
values,
selection,
selectionArgs);