Anda di halaman 1dari 13

www.tobuku.

com

Program Database Sederhana di Android


Desember 2011 Oleh : Feri Djuandi Platform : ndroid 2!"# $%li&se# '()ite
Tingkat:

Pemula Menengah Mahir

rtikel ini meru&akan lanjutan dari tulisan sebelumn*a *ang berjudul +Menggunakan Database di ndroid,! nda dianjurkan untuk memba%a artikel tersebut karena mengandung &enjelasan dasar-dasar database di ndroid *ang sangat berguna untuk memberikan landasan &emahaman terutama untuk &emula! Pada &embahasan ini akan di&erlihatkan sebuah &rogram sederhana untuk membuat database SQLite# membuat sebuah table dan mengisi data ke dalamn*a# dan menam&ilkan data tersebut! Penjelasan ini sengaja menggunakan %ontoh *ang sangat sederhana su&a*a &ara &emba%a da&at memahami &rinsi&-&rinsi& *ang esensial di dalam &enggunaan database '()ite! Tam&ilan out&ut &ada la*ar &un akan dibuat minimalis dengan mengabaikan tam&ilan *ang di&er%antik untuk menghindari tambahan-tambahan baris &rogram &emanis *ang mengesankan keru-etan dan mengaburkan fokus &emba%a &ada inti &embahasan! Men*im&an dan menam&ilkan data adalah o&erasi database *ang sangat mendasar# namun &erlu disadari bah-a a&likasi *ang %anggih dan sangat kom&leks sekali&un tidak le&as dari o&erasi-o&erasi dasar tersebut! Oleh karena itu &ara &rogrammer &erlu mengetahui teknikteknik dan &enggunaan class-class *ang berkaitan dengan database mulai dari taha& *ang a-al! 'etelah dikuasain*a konse& dasar tersebut# selanjutn*a nda bisa mengembangkan dan mengombinasikan berbagai teknik *ang lebih baik dan efisien sesuai dengan ke&erluan! .ontoh &rogram ini terdiri dari dua bagian# *aitu &rogram *ang menam&ilkan sebuah form &engisian data dimana &engguna bisa memasukkan data kemudian men*im&ann*a di dalam database! /agian *ang ke-dua adalah untuk menam&ilkan data *ang tersim&an! 'ebelum kedua bagian &rogram itu bisa bekerja# tentun*a &rogram utama akan terlebih dahulu men*ia&kan database dan membuat table dengan struktur tertentu! 0ntuk memberikan gambaran *ang lebih jelas dari %ara kerja &rogram tersebut# silakan mem&erhatikan bebera&a ilustrasi di ba-ah ini! 'aat &rogram dijalankan ada dua buah tombol untuk memilih antara memasukan data 12e-3 atau menam&ilkan data 1/ro-se3!

-1-

www.tobuku.com 'aat tombol 2e- ditekan# sebuah form ditam&ilkan untuk &engisian data! Pengguna melengka&i semua field kemudian menekan tombol 'a4e untuk men*im&an data!

5embali &ada tam&ilan utama! 'aat tombol /ro-se ditekan# data-data akan ditam&ilkan se%ara bergantian &ada kotak &esan mulai dari a-al hingga akhir!

-2-

www.tobuku.com /erikut ini adalah uraian mengenai &embuatan &rogram tersebut! 1! 6alankan Eclipse dan buat sebuah Android Project!

2! /uat sebuah %lass baru bernama DBAdapter dengan kode &rogram di ba-ah ini! nda tidak &erlu mengetikkan sendiri kode &rogram itu karena &rogram selengka&n*a bisa diunduh dari situs -eb dimana artikel ini berasal! .lass ini dibuat untuk menem&atkan sub-&rogram *ang menangani o&erasi-o&erasi database se&erti &embuatan table# &engisian data# &erubahan data# &engha&usan data dan &emanggilan data! Tujuann*a adalah tidak men%am&ur-adukkan logika bisnis dengan o&erasi tingkat rendah 1'$)$.T# 72'$8T# 0PD T$ dan D$)$T$3 *ang akan membuat kode &rogram sulit diba%a dan berkesan rumit sekali! 0ntuk tujuan kera&ihan &rogram# akan jauh lebih baik jika &rogram utama fokus han*a &ada jalann*a alur &rogram utama# sementara fungsi-fungsi database di&isahkan ke dalam %lass D/ da&ter ini! Program utama %uku& memanggil fungsi-fungsin*a se%ara sederhana dengan satu baris &erintah saja# -alau&un sebetuln*a fungsi itu ditulis dengan baris *ang &anjang dan &roses *ang rumit di bagian sub-&rogram!

-"-

www.tobuku.com

package net.houseoflife.dbsample; import import import import import import import android.content.ContentValues; android.content.Context; android.database.Cursor; android.database.SQLException; android.database.sqlite.SQLiteDatabase; android.database.sqlite.SQLiteOpenHelper; android.util.Log;

public class DBAdapter { private static final String TAG="DBAdapter"; private static final String DATABASE_NAME="mycompany.sqlite"; private static final int DATABASE_VERSION=1; private static final String TABLE_CREATE = "create table customers (_id integer primary key autoincrement, " + "custname text not null, custaddr text not null, " + "custgender text not null, custphone text not null)"; private static final String TABLE_DROP = "DROP TABLE IF EXISTS customers"; public static final String KEY_ROWID="_id"; public static final String KEY_CUSTNAME="custname"; public static final String KEY_CUSTADDR="custaddr"; public static final String KEY_CUSTGENDER="custgender"; public static final String KEY_CUSTPHONE="custphone"; 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) { db.execSQL(TABLE_CREATE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data");

-9-

www.tobuku.com

db.execSQL(TABLE_DROP); onCreate(db); } } public DBAdapter open() throws SQLException { db = dbHelper.getWritableDatabase(); return this; } public void close() { dbHelper.close(); } public long insertCustomer(String custName, String custAddr, char custGender, String custPhone) { ContentValues initialValues = new ContentValues(); initialValues.put(KEY_CUSTNAME, custName); initialValues.put(KEY_CUSTADDR, custAddr); initialValues.put(KEY_CUSTGENDER, Character.toString(custGender)); initialValues.put(KEY_CUSTPHONE, custPhone); return db.insert("customers", null, initialValues); } public Cursor getAllCustomers() { return db.query("customers", new String[] { KEY_ROWID, KEY_CUSTNAME, KEY_CUSTADDR, KEY_CUSTGENDER, KEY_CUSTPHONE }, null, null, null, null, KEY_ROWID + " DESC"); } }

Dengan merujuk &ada konse& embedded database# tam&ak bah-a &rogram ini akan membuat sebuah database '()ite bernama mycompany.sqlite &ada &erangkat android *aitu smartphone atau tablet android; atau emulator android jika &rogram ini dijalankan &ada kom&uter selama masih dalam taha& &engembangan! 'elanjutn*a ke dalam database itu akan ditambahkan sebuah table bernama customers dengan &erintah .8$ T$ berikut ini#
private static final String TABLE_CREATE = "create table customers (_id integer primary key autoincrement, " + "custname text not null, custaddr text not null, " + "custgender text not null, custphone text not null)";

-:-

www.tobuku.com

Database dan table tersebut akan dibentuk saat &rogram dijalankan &ertama kali# *aitu melalui objek DatabaseHelper saat ia diinisiasi!
private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context ctx) { super(ctx, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(TABLE_CREATE); } ...

Pada bagian akhir dari %lass tersebut tam&ak dua buah method bernama insertCustomer dan getAllCustomers *ang masing-masing berfungsi untuk menambahkan data ke dalam table %ustomers dan mengambil data dari dalamn*a! Perhatikan %ara &enggunaan fungsi insert dan query *ang bisa jadi meru&akan sesuatu *ang baru untuk nda# serta &enggunaan objek Cursor untuk menam&ung baris-baris hasil &engambilan data! "! /uka res layout main. ml untuk meran%ang tam&ilan la*ar utama! Tambahkan dua buah tombol &ada tam&ilan se&erti di&erlihatkan di ba-ah ini!

/utton: id= 2e-.ust# id = /ro-se.ust

9! /uat sebuah file Android !"L dan beri nama sebagai customer#$orm. ml dengan ti&e Layout!

-<-

www.tobuku.com :! 'ilakan mendesain form &engsian data se&erti di&erlihatkan oleh gambar berikut ini!

$ditTe@t: id=.ust2ame $ditTe@t: id=.ust ddr 8adio/utton: id=AMale# id=AFemale $ditTe@t: id=.ustPhone /utton: id='a4e

<! /uat sebuah file ndroid ?M) lain dan beri nama sebagai sa%e#customer. ml dengan ti&e Layout! Tambahkan sebuah tombol &ada tam&ilan se&erti di&erlihatkan di ba-ah ini!

/utton: id=/utton01

->-

www.tobuku.com

>! /uka %lass "ainActi%ity.ja%a untuk menambahkan kode &rogram sebagai berikut!
package net.houseoflife.dbsample; import import import import import import import android.app.Activity; android.content.Intent; android.database.Cursor; android.os.Bundle; android.view.View; android.widget.Button; 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); Button btnNew = (Button) findViewById(R.id.NewCust btnNew.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Intent i = new Intent(MainActivity.this, CustomerForm.class); startActivity(i); } } ); Button btnBrowse = (Button) findViewById(R.id.BrowseCust btnBrowse.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { DBAdapter db = new DBAdapter(MainActivity.this); db.open(); Cursor c = db.getAllCustomers(); if (c.moveToFirst()) { do { Toast.makeText(MainActivity.this, c.getString(1) + ", " + c.getString(2), Toast.LENGTH_SHORT).show(); } while (c.moveToNext()); } else Toast.makeText(MainActivity.this, "No data", Toast.LENGTH_SHORT).show(); db.close(); } } ); } }

-B-

www.tobuku.com

/agian ter&enting dari &rogram ini adalah menagani aksi &enekanan tombol 2e- dan /ro-se! 'aat tombol 2e- ditekan maka %lass CustomerForm akan di&anggil untuk menam&ilkan la*ar *ang ditunjukkan oleh %ustomerDform!@ml# *aitu untuk &engisian data! 2amun saat tombol /ro-se ditekan# maka data *ang tersim&an di dalam database '()ite akan ditam&ilkan melalui baris &rogram berikut ini:
... Cursor c = db.getAllCustomers(); if (c.moveToFirst()) { do { ... } while (c.moveToNext()); ...

B! /uat sebuah %lass baru bernama Customer&orm *ang berisi &rogram sebagai berikut!
package net.houseoflife.dbsample; import import import import import import import import import import android.app.Activity; android.app.AlertDialog; android.content.Context; android.content.DialogInterface; android.content.Intent; android.os.Bundle; android.view.View; android.widget.Button; android.widget.EditText; android.widget.RadioGroup;

public class CustomerForm extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.customer_form); Button btnEducation = (Button) findViewById(R.id.Save); btnEducation.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { //validate data entries String custName = ((EditText) findViewById(R.id.CustName)).getText().toString().trim(); String custAddr = ((EditText) findViewById(R.id.CustAddr)).getText().toString().trim(); String custPhone = ((EditText) findViewById(R.id.CustPhone)).getText().toString().trim(); char custGender = 'X'; switch (((RadioGroup) findViewById(R.id.CustGender)).getCheckedRadioButtonId()) {

-C-

www.tobuku.com

case R.id.GMale: custGender='M'; break; case R.id.GFemale: custGender='F'; break; } Context context=CustomerForm.this; if(custName.equals("") || custAddr.equals("") || custPhone.equals("") || custGender == 'X') { String e = "Please complete the data."; new AlertDialog.Builder(context) .setTitle("Invalid Data") .setMessage(e) .setNeutralButton("Close", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }).show(); } else { //If OK, then send the data to save Intent i = new Intent(CustomerForm.this, SaveCustomer.class); i.putExtra("CustName", custName); i.putExtra("CustAddr", custAddr); i.putExtra("CustPhone", custPhone); i.putExtra("CustGender", custGender); startActivity(i); } } } ); } }

Program di atas memeriksa isian &ada form untuk memastikan semua field diisi! 'aat semua data telah diisi dengan benar maka ia akan mengirim isi semua field ke&ada %lass lain *ang bernama SaveCustomer melalui baris-baris &rogram:
... Intent i = new Intent(CustomerForm.this, SaveCustomer.class); i.putExtra("CustName", custName); i.putExtra("CustAddr", custAddr); i.putExtra("CustPhone", custPhone);

- 10 -

www.tobuku.com

i.putExtra("CustGender", custGender); startActivity(i); ...

C! /uat %lass *ang terakhir bernama Sa%eCustomer *ang berisi &rogram sebagai berikut!
package net.houseoflife.dbsample; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; public class SaveCustomer extends Activity{ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.save_customer); //get the inputed data Intent i = getIntent(); Bundle b = i.getExtras(); String custName = b.getString("CustName"); String custAddr = b.getString("CustAddr"); String custPhone = b.getString("CustPhone"); char custGender = b.getChar("CustGender"); DBAdapter db = new DBAdapter(this try { db.open(); long id = db.insertCustomer(custName,custAddr,custGender,custPhone); Toast .makeText(this, "Data successfully saved", Toast.LENGTH_SHORT) .show(); } catch(Exception ex) { Toast .makeText(this, "Saving error", Toast.LENGTH_SHORT) .show(); } finally { db.close(); }

- 11 -

www.tobuku.com

Button btnBack = (Button) findViewById(R.id.Button01); btnBack.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Intent i = new Intent(SaveCustomer.this, MainActivity.class); startActivity(i); } } ); } }

Program ini menangka& nilai-nilai field *ang dikirim oleh %lass sebelumn*a kemudian men*im&an data tersebut ke dalam table melalui fungsi insert.ustomer! O&erasi database dilakukan di dalam blok try-catch untuk mengantisi&asi jika seandain*a terjadi database error *ang bisa mengakibatkan &rogram berhenti se%ara mendadak! /lok tr*-%at%h akan menangka& error sema%am itu se%ara elegan dan menam&ilkan &esan error tan&a mengakibatkan &rogram berhenti! 'aat data berhasil disim&an# ia akan menam&ilkan &esan EData su%%essfull* sa4edE# dan tam&ak sebuah tombol *ang jika ditekan akan mengembalikan tam&ilan ke la*ar utama se&erti semula! 10! Pada langkah terakhir# buka file Android"ani$est. ml dan tambahkanFedit baris *ang ditandai di ba-ah ini!
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="net.houseoflife.dbsample" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MainActivity" android:label="Customer Entry/View"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".CustomerForm" android:label="Customer Data"></activity> <activity android:name=".SaveCustomer" android:label="Save Data"></activity> </application> <uses-sdk android:minSdkVersion="7" /> </manifest>

11! 'ilakan menjalankan &rogram tersebut &ada emulator ndroid untuk melihat hasiln*a!

- 12 -

www.tobuku.com 'etelah nda berhasil memasukkan bebera&a data# silakan mengambil database '()ite *ang ada di dalam emulator agar bisa dilihat isin*a menggunakan &rogram SQLite Manager. )angkahlangkah untuk mengambil database dan memba%a isin*a telah dijelaskan &ada artikel sebelumn*a se&erti *ang dijelaskan &ada bagian a-al tulisan ini! 'ebagai &enutu& berikut ini adalah bebera&a method &enting *ang ada di dalam %lass SQLiteDatabase *ang meru&akan o&erasi dasar &engo&erasian database '()ite! Penggunaan method tersebut harus di&ahami karena mereka ham&ir selalu digunakan di dalam a&likasi database! "et'od insert query update delete e ecSQL &ungsi Menambah baris data ke dalam sebuah table Men%ariFmengambil data dari sebuah table Mengubah data dalam sebuah table Mengha&us data dalam sebuah table Menjalankan &erintah '() di dalam database

Di luar method tersebut masih ada ban*ak method lain *ang &erlu nda ketahui &emakaiann*a untuk mengo&timalkan &enggunaan database '()ite di dalam a&likasi ndroid! 'ilakan memba%a referensi di ba-ah ini untuk informasi lebih lengka& mengenai method dan &erintah '(): htt&:FF---!sGlite!orgFlang!html htt&:FF---!sGlite!orgFlangD%orefun%!html htt&:FFde4elo&er!android!%omFreferen%eFandroidFdatabaseFsGliteF'()iteDatabase!html

- 1" -

Anda mungkin juga menyukai