Aplikasi Android dengan Pre-built Database - tobuku.com Android dengan Pre-built Database.pdf ·...
Click here to load reader
Transcript of Aplikasi Android dengan Pre-built Database - tobuku.com Android dengan Pre-built Database.pdf ·...
www.tobuku.com
- 1 -
Aplikasi Android dengan Pre-built Database
Desember 2011 Tingkat: √ Oleh : Feri Djuandi Pemula Menengah Mahir
Platform : Android 2.3, Eclipse, SQLite
Pembahasan database pada aplikasi Android selama ini mengasumsikan database SQLite belum
terbentuk atau tidak disertakan di dalam program sehingga database akan dibuat pada saat
aplikasi pertama kali dijalankan. Pada kondisi tersebut database dalam keadaan kosong (tidak
mengandung data apapun), kecuali hanya terdiri dari sebuah atau beberapa table yang dibuat
bersamaan dengan database tersebut menggunakan perintah CREATE. Bagaimana seandainya
programmer hendak mendistribusikan sebuah aplikasi Android yang mengandung database
dengan data yang telah dipersiapkan? Mungkinkah sebuah aplikasi Android menyertakan pre-
built database di dalam paket instalasinya? Dengan semakin berkembangnya penggunaan
perangkat Android dalam aplikasi bisnis maka ada banyak sekali kebutuhan dari hal ini, misalnya
untuk memuat daftar produk dan harga pada aplikasi penjualan, daftar rekanan bengkel dan
alamat pada aplikasi klaim asuransi, simulasi kredit pada aplikasi pembiayaan, daftar produk dan
premi asuransi pada aplikasi ilustrasi dan penerapan-penerapan lainnya – yang semuanya itu
membutuhkan database berisi data yang sudah disiapkan sebelumnya.
Artikel ini akan menjelaskan konsep dan teknik dasar pembuatan pre-built database,
mengemasnya di dalam aplikasi serta penggunaannya saat aplikasi dijalankan. Semoga uraian ini
menjadi topik yang menarik bagi Anda.
Langkah pertama tentunya mempersiapkan pre-built database itu sendiri, yang umumnya
menggunakan sebuah database management tool yang akan membantu programmer dalam
mempersiapkan sebuah database SQLite. Dengan bantuan Google seorang programmer dapat
dengan mudah menemukan beberapa database manager untuk SQLite, namun salah satu yang
cukup populer adalah SQLite Manager. Program SQLite Manager berbentuk add-on yang diinstal
pada program Mozilla Firefox, oleh karena itu harus dipastikan program browser tersebut telah
terinstal sebelumnya pada komputer Anda. SQLite Manager adalah program yang sangat
sederhana dan praktis, namun bisa memenuhi hampir semua keperluan programmer. Ia
memiliki menu untuk membuat database, table, index, view dan trigger; serta sebuah kotak
untuk menulis dan menjalankan perintah SQL. Sebuah program yang cukup lengkap dan mudah
digunakan.
Program SQLite Manager dapat dunduh secara gratis pada alamat berikut ini:
https://addons.mozilla.org/id/firefox/addon/sqlite-manager/
Pada uraian ini akan digunakan sebuah contoh database yang memuat data produk seperti yang
digunakan pada aplikasi penjualan. Anggaplah bahwa Anda sedang mempersiapkan sebuah
daftar produk dari sebuah perusahaan, kemudian data ini akan digunakan oleh para pemasar
melalui smartphone Android-nya dan aplikasi yang Anda kembangkan.
www.tobuku.com
- 2 -
1. Jalankan SQLite Manager menggunakan program Mozilla Firefox melalui menu Tools ����
SQLite Manager.
2. Jalankan menu Database ���� New Database untuk membuat sebuah database SQLite
baru yang bernama productdemo.sqlite. Anda bebas untuk menempatkan file
databasenya pada folder manapun di dalam komputer.
3. Pada tab Execute SQL, ketikkan perintah berikut ini untuk membuat sebuah table
bernama productlist.
CREATE TABLE productlist (
_id INTEGER PRIMARY KEY AUTOINCREMENT,
prodcategory TEXT,
prodname TEXT,
ccy TEXT,
unitprice FLOAT );
Jalankan perintah tersebut dengan menekan tombol Run SQL. Pastikan table itu telah
terbentuk tanpa pesan kesalahan.
www.tobuku.com
- 3 -
CATATAN:
Berikut ini adalah tipe-tipe data yang didukung oleh SQLite:
www.tobuku.com
- 4 -
4. Masukkan beberapa baris data ke dalam table tersebut dengan perintah INSERT seperti berikut ini.
INSERT INTO productlist (prodcategory, prodname, ccy, unitprice) VALUES('Book','O Little Town','USD',11.5);
INSERT INTO productlist (prodcategory, prodname, ccy, unitprice) VALUES('Book','A Dixie Christmas','USD',9.95);
INSERT INTO productlist (prodcategory, prodname, ccy, unitprice) VALUES('Book','The Adventures and the Memoirs of Sherlock
Holmes','USD',9.95);
INSERT INTO productlist (prodcategory, prodname, ccy, unitprice) VALUES('Book','The Hunger Games','USD',23.36);
INSERT INTO productlist (prodcategory, prodname, ccy, unitprice) VALUES('Electronic','Apple iPod touch 32GB','USD',264.99);
INSERT INTO productlist (prodcategory, prodname, ccy, unitprice) VALUES('Electronic','Garmin nüvi 1490LMT 5-Inch','USD',349.99);
INSERT INTO productlist (prodcategory, prodname, ccy, unitprice) VALUES('Computer','Kindle Fire, Full Color 7" Multi-touch Display,
Wi-Fi','USD',199.00 );
INSERT INTO productlist (prodcategory, prodname, ccy, unitprice) VALUES('Computer','Apple MacBook Pro MD318LL/A 15.4-
Inch','USD',1709.88 );
INSERT INTO productlist (prodcategory, prodname, ccy, unitprice) VALUES('Computer','HP TouchPad Wi-Fi 32 GB 9.7','USD',280.99 );
INSERT INTO productlist (prodcategory, prodname, ccy, unitprice) VALUES('Software','Kaspersky Internet Security','USD',79.95);
INSERT INTO productlist (prodcategory, prodname, ccy, unitprice) VALUES('Software','Microsoft Office Home & Student
2010','USD',149.99);
Pindah ke tab Browse and Search untuk melihat isi dari table tersebut (pastikan table productlist telah disorot).
www.tobuku.com
- 5 -
Untuk sementara pre-built database telah selesai dibuat. Tahap berikutnya adalah membuat
sebuah aplikasi Android yang akan menggunakan database tersebut.
1. Jalankan Eclipse dan buat sebuah Android Project baru.
2. Buat sebuah class baru bernama DBAdapter dengan kode program di bawah ini. Anda
tidak perlu mengetikkan sendiri kode program itu karena program selengkapnya bisa
diunduh dari situs web dimana artikel ini berasal.
Class ini dibuat untuk menempatkan sub-program yang menangani operasi-operasi
database seperti pembuatan table, pengisian data, perubahan data, penghapusan data
dan pemanggilan data. Tujuannya adalah tidak mencampur-adukkan logika bisnis
dengan operasi tingkat rendah (SELECT, INSERT, UPDATE dan DELETE) yang akan
membuat kode program sulit dibaca dan berkesan rumit sekali. Untuk tujuan kerapihan
program, akan jauh lebih baik jika program utama fokus hanya pada jalannya alur
program utama, sementara fungsi-fungsi database dipisahkan ke dalam class DBAdapter
ini.
www.tobuku.com
- 6 -
package net.houseoflife.dbsample;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
public class DBAdapter {
private static final String DATABASE_PATH="/data/data/net.houseoflife.dbsample/databases/";
private static final String DATABASE_NAME="productdemo.sqlite";
private static final int DATABASE_VERSION=1;
private final Context context;
private DatabaseHelper dbHelper;
private SQLiteDatabase db;
public DBAdapter(Context ctx) {
this.context = ctx;
dbHelper = new DatabaseHelper(this.context);
}
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context ctx) {
super(ctx, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
//do nothing. The event is handled by the "prepareDatabase" method.
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//do nothing. The event is handled by the "prepareDatabase" method.
}
}
public DBAdapter open() throws SQLException {
db = dbHelper.getWritableDatabase(); //or getReadableDatabase() for read only access
return this;
}
www.tobuku.com
- 7 -
public void close() {
dbHelper.close();
}
private boolean checkDatabase() {
SQLiteDatabase checkDb = null;
try {
checkDb = SQLiteDatabase.openDatabase(DATABASE_PATH + DATABASE_NAME, null, SQLiteDatabase.OPEN_READONLY);
}
catch (SQLiteException ex) {
//Database does not exist yet
}
if(checkDb != null)
checkDb.close();
return checkDb != null ? true : false;
}
private void copyDatabase() throws IOException {
//get the SQLite database in the "assets" folder
InputStream input = context.getAssets().open(DATABASE_NAME);
//copy to the device path
OutputStream output = new FileOutputStream(DATABASE_PATH + DATABASE_NAME);
byte[] buffer = new byte[1024];
int length;
while ((length = input.read(buffer))>0)
output.write(buffer,0,length);
output.flush();
output.close();
input.close();
}
public void prepareDatabase() {
if(this.checkDatabase()) {
//do nothing. The database already exists
}
else {
try {
this.copyDatabase() ;
}
catch (IOException ex) {
throw new Error ("Error copying database");
www.tobuku.com
- 8 -
}
}
}
}
Untuk mempermudah pemahaman kerja dari sub-program ini, silakan memulainya dari method prepareDatabase. Saat method ini
dipanggil ia akan menjalankan method lain yang bernama checkDatabase. Fungsi method checkDatabase cukup jelas, yaitu ia
memeriksa keberadaan file database yang diwakili oleh konstanta DATABASE_PATH + DATABASE_NAME (dalam hal ini adalah
"/data/data/net.houseoflife.dbsample/databases/productdemo.sqlite"). Ini adalah lokasi dan nama file database SQLite yang mestinya
ada di dalam perangkat Android, namun ada kemungkinan file itu tidak ada di sana jika aplikasi ini dijalankan pertama kali. Jika file itu
belum ada maka fungsi openDatabase akan memicu sebuah error, itu sebabnya pemanggilan fungsi ini harus ada di dalam blok try-catch
supaya program tidak berhenti. Saat terjadi error, maka method checkDatabase akan mengembalikan nilai FALSE yang artinya adalah
file database tidak ada di dalam perangkat.
Saat nilai yang dikembalikan adalah FALSE maka baris program selanjutnya akan memanggil method copyDatabase yang akan berusaha
menyalin file database yang ada di dalam folder aplikasi (yaitu folder assets) ke dalam perangkat Android. Perhatikan baik-baik beberapa
potongan kode program berikut ini karena itu adalah bagian terpenting dari uraian ini.
InputStream input = context.getAssets().open(DATABASE_NAME);
...
Program mempersiapkan sumber penyalinan data, yaitu file database yang
diwakili oleh konstanta DATABASE_NAME. Fungsi getAssets digunakan untuk
mencari file tersebut di dalam folder assets.
OutputStream output = new FileOutputStream(DATABASE_PATH +
DATABASE_NAME);
...
Program mempersiapkan target penyalinan data, yaitu ke dalam perangkat
Android yang lokasinya diwakili oleh DATABASE_PATH + DATABASE_NAME.
byte[] buffer = new byte[1024];
int length;
while ((length = input.read(buffer))>0)
output.write(buffer,0,length);
Data dari file database dibaca sepotong demi sepotong (besar sebuah
potongan adalah 1024 byte) menggunakan fungsi read kemudian ditulis
dengan fungsi write.
www.tobuku.com
- 9 -
3. Buka class MainActivity, dan tambahkan kode program berikut ini.
package net.houseoflife.dbsample;
import android.app.Activity;
import android.database.Cursor;
import android.database.SQLException;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DBAdapter db = new DBAdapter(this);
db.prepareDatabase();
try {
db.open();
//read the data
Cursor c = db.getAllProducts();
if (c.moveToFirst()) {
do {
Toast.makeText(MainActivity.this, c.getString(0) + "; " + c.getString(1) + "; " + c.getString(2) + " " +
c.getFloat(3), Toast.LENGTH_SHORT).show();
} while (c.moveToNext());
}
else
Toast.makeText(MainActivity.this, "No data", Toast.LENGTH_SHORT).show();
db.close();
}
catch (SQLException sqle) {
Toast
.makeText(this, sqle.getMessage(), Toast.LENGTH_SHORT).show();
}
}
}
www.tobuku.com
- 10 -
4. Sebagai langkah terakhir, ada satu hal lagi yang harus dipersiapkan yaitu menyalin file
database pre-built productdemo.sqlite yang telah dipersiapkan pada langkah awal tadi
ke dalam folder projek - tepatnya ke dalam folder assets seperti diperlihatkan pada
gambar di bawah ini.
Pastikan nama file itu muncul pada Package Explorer di dalam Eclipse. Refresh folder
assets jika file tersebut belum tampak.
Setelah langkah terakhir ini selesai dilakukan, silakan menjalankan aplikasi tersebut.
www.tobuku.com
- 11 -
Saat aplikasi itu dieksekusi, tampak data-data yang ada di dalam database ditampilkan secara
bergantian. Bila ini yang terjadi, maka bisa dipastikan program telah berjalan dengan baik.
Mari kita telaah lebih jauh apa yang telah dilakukan oleh program ini.
1. Pada Eclipse, jalankan menu Windows ���� Open Perspective ���� DDMS.
2. Pada File Explorer, buka folder data/data/<namespace>/databases. Pada contoh ini
namespace adalah net.houseoflife.dbsample. Perhatikan path ini adalah sama dengan
nilai konstanta DATABASE_PATH pada kode program yang ditunjukkan tadi. Path ini
menyatakan lokasi file database di dalam perangkat Android.
Apakah Anda menemukan file productdemo.sqlite di dalam lokasi tersebut? Jika ya,
maka method copyDatabase yang dijelaskan tadi telah bekerja dengan baik. Ia berhasil
menyalin file dari folder assets ke dalam lokasi ini seperti yang diharapkan.
www.tobuku.com
- 12 -
Sekarang kita akan melakukan beberapa pengujian akhir.
� Hapus file productdemo.sqlite yang ada di dalam perangkat Android dengan tombol
bertanda minus merah seperti ditunjukkan pada gambar tadi.
� Jalankan kembali aplikasi tersebut.
� Apakah aplikasi itu masih bekerja normal menampilkan data-datanya?
Saat kembali ke DDMS perspective apakah file productdemo.sqlite terbentuk kembali?
Mari kita lakukan pengujian yang ke-dua.
� Hapus file database productdemo.sqlite yang ada di dalam folder assets kemudian
jalankan kembali aplikasi tersebut.
� Apakah aplikasi itu masih bekerja normal menampilkan data-datanya? Setelah database
ada di dalam perangkat Android, apakah aplikasi masih membutuhkan file yang ada di
dalam folder assets?
Semoga Anda bisa menjelaskan jawaban pertanyaan-pertanyaan di atas untuk memastikan
Anda memahami konsep yang telah dijelaskan dengan panjang-lebar ini.
Sumber:
� http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-
applications/