Android: Complete Database Tutorial

Tulisan kali ini akan mengupas tentang cara membuat aplikasi database di android. Pada tutorial kali ada, ada banyak sekali trik-trik development android yang saya berikan, diantaranya:

  • Penggunaan SQLite untuk INSERT, UPDATE, DELETE data. Berikut dengan proses CREATE TABLE.
  • Penggunaan custom ListView dan adapter untuk membaca database.
  • Cara membuat Context Menu
  • Cara membuat custom Dialog untuk proses input data

Catatan: Kode yang saya tampilkan hanya berupa potongan-potongan yang sekiranya relevan dengan topik yang sedang dibahas. Untuk kode lengkapnya, bisa didownload di akhir tutorial.

Penggunaan SQLite

Sebelum menggunakan database, kita perlu menciptakan terlebih dahulu menggunakan openOrCreateDatabase().

private SQLiteDatabase database = null;
database = this.context.openOrCreateDatabase("book.db",
		SQLiteDatabase.CREATE_IF_NECESSARY, null);
String sqlCreate = "CREATE TABLE IF NOT EXISTS " + BOOK_NAME + " ("
		+ "isbn TEXT PRIMARY KEY," + "judul TEXT,"
		+ "nama_penulis TEXT" + ");";

database.beginTransaction();
database.execSQL(sqlCreate);
database.setTransactionSuccessful();

Untuk melakukan proses query, kita akan membutuhkan object Cursor.

ArrayList<Book> allBook = null;
allBook = new ArrayList<Book>();
cursor = database.rawQuery("SELECT * FROM " + BOOK_NAME, null);
if (cursor.getCount() > 0) {
	int indexISBN = cursor.getColumnIndex("isbn");
	int indexJudul = cursor.getColumnIndex("judul");
	int indexNama = cursor.getColumnIndex("nama_penulis");
	cursor.moveToFirst();
	do {
		String judul = cursor.getString(indexJudul);
		String namaPenulis = cursor.getString(indexNama);
		String ISBN = cursor.getString(indexISBN);

		Book book = new Book();
		book.setJudul(judul);
		book.setNamaPenulis(namaPenulis);
		book.setISBN(ISBN);

		allBook.add(book);

		cursor.moveToNext();
	} while (!cursor.isAfterLast());
}

Proses berikutnya, yang berhubungan dengan INSERT, UPDATE, dan DELETE data. Alurnya tidak begitu berbeda dengan proses membuat table. Yang membedakan hanya pada penambahan parameter.

database.beginTransaction();

String insertSQL = "INSERT INTO " + BOOK_NAME
		+ " (isbn, judul, nama_penulis) VALUES(?,?,?)";
database.execSQL( insertSQL,
		new Object[] { book.getISBN(), book.getJudul(),
				book.getNamaPenulis() });

database.setTransactionSuccessful();

Custom ListView dan ListAdapter

ListView di android, paling sederhana akan melibatkan 2 file layout XML. XML pertama, untuk menampung ListView itu sendiri. Sedangkan XML satunya untuk mendefinisikan bagaimana android akan menampilkan element dari masing-masing list.

main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    
    <ListView
        android:id="@+id/lsvListBook"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_alignParentTop="true"
	/>
</RelativeLayout >

list.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <TextView
        android:id="@+id/txtListJudulBuku"
        android:layout_width="wrap_content"
        android:layout_marginTop="5px"
        android:layout_marginBottom="10px"
        android:layout_height="wrap_content"
        android:text="TextView" />

</LinearLayout>

Lalu, bagaimana kita menyambungkan antara view dari ListView dan detail-nya? Itu adalah tugas dari adapter. Pada android, kalau kita ingin membuat custom adapter, bisa dengan meng-extends BaseAdapter.

lsvBookView = (ListView) findViewById(R.id.lsvListBook);
bookDB = new BookDB(getApplicationContext());
adapter = new BookAdapter(this);
listBook = bookDB.toArray();

adapter.updateListBook(listBook);
lsvBookView.setAdapter(adapter);

Berikut kode untuk BaseAdapter:

public class BookAdapter extends BaseAdapter {
	private ArrayList<Book> listBook = null;
	private static LayoutInflater inflater = null;

	public BookAdapter(Activity activity) {
		inflater = (LayoutInflater) activity
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}

	public void updateListBook(ArrayList<Book> newListBook) {
		this.listBook = newListBook;
	}

	@Override
	public int getCount() {
		return this.listBook.size();
	}

	@Override
	public Book getItem(int position) {
		return this.listBook.get(position);
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View view, ViewGroup viewGroup) {
	}

}

Secara umum, yang kita wajib kita override dari BaseAdapter adalah getCount(), getItem(), getItemId(), dan getView(). Nah, getView() ini yang pada akhirnya akan memproses file detail (dalam kasus ini, list.xml) untuk menghasilkan view detail.

@Override
public View getView(int position, View view, ViewGroup viewGroup) {
	View vi = view;
	if (vi == null) {
		vi = inflater.inflate(R.layout.list, null);
	}

	Book book = this.listBook.get(position);

	TextView txtListJudul = (TextView) vi
			.findViewById(R.id.txtListJudulBuku);

	txtListJudul.setText(book.getJudul());

	return vi;
}

Bisa dilihat bagaimana getView() memproses informasi posisi dan view pada posisi tersebut. Dengan cara ini, kita bisa bermain-main dengan tampilan isi ListView. Misal, suatu saat, anda ingin membuat ListView yang bila posisi ke-10 berisi data foto, maka akan menampilkan foto tersebut. Tapi, bila berisi data lagu, akan menampilkan view berupa control music (play, pause, stop, dll).

Ada satu lagi trik yang berguna, bila berhubungan dengan ListView. Seperti yang sudah disebutkan di atas, untuk menghubungkan ListView dengan data, kita menggunakan Adapter. Lalu, bagaimana caranya bila suatu ketika data yang ada berubah? Sederhana, cukup dengan menyetting ulang ListView.setAdapter():

/**
 * We need to refresh adapter for every data update. Without it, ListView will never be refreshed. 
 */
protected void refreshListAdapter() {
	listBook = bookDB.toArray();
	adapter.updateListBook(listBook);
	lsvBookView.setAdapter(adapter);
}

Membuat ContextMenu

Pada umumnya, context menu adalah menu yang muncul saat melakukan long-press pada suatu element view. Pada tutorial ini, ContextMenu akan diimplementasikan pada long-press di ListView. Tujuannya untuk menampilkan menu Edit dan Delete. Flownya secara singkat adalah sebagai berikut:

  1. menambahkan registerForContextMenu() pada onCreate()
  2. Override onCreateContextMenu() untuk menambahkan menu item pada context menu
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo cmInfo) {
    	if (v.getId() == R.id.lsvListBook) {
    		AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) cmInfo;
    		menu.setHeaderTitle(listBook.get(info.position).getJudul());
    		String[] menuItems = { "Update", "Delete" };
    		for (int menuIndex = 0; menuIndex < menuItems.length; menuIndex++) {
    			menu.add(Menu.NONE, menuIndex, menuIndex, menuItems[menuIndex]);
    		}
    	}
    }
    
  3. Override onContextItemSelected() untuk menghandle saat context menu item terpilih
    @Override
    public boolean onContextItemSelected(MenuItem item) {
    	AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
    	int menuItemIndex = item.getItemId();
    	Book book = listBook.get(info.position);
    
    	switch (menuItemIndex) {// taken from menuItems in onCreateContextMenu()
    	case 0:
    		showFormDialog(book);
    		break;
    	case 1:
    		Log.i("Log", "item " + book.getJudul() + " deleted!");
    		bookDB.delete(book);
    		refreshListAdapter();
    		break;
    	}
    	return true;
    }
    

Membuat custom Dialog

Membuat custom dialog di android cukup mudah. Pertama, seperti biasa, inisialisasi object:

formDialog = new Dialog(ListDataActivity.this);
formDialog.setContentView(R.layout.form);
formDialog.setTitle("Form Buku");

Lalu (opsional) buat supaya dialog ini nantinya selebar layar. Sebab, bila tidak diset secara manual, akan terlalu sempit hasilnya:

// set dialog width to fill_parent
LayoutParams formDialogParams = formDialog.getWindow().getAttributes();
formDialogParams.width = LayoutParams.FILL_PARENT;
formDialog.getWindow().setAttributes(
		(android.view.WindowManager.LayoutParams) formDialogParams);

Yang terakhir tinggal memanggil show() untuk menampilkan dialog tersebut:

formDialog.show();

Sekian dulu tutorial kali ini. Stay tune di twitter saya @ariefbayu atau facebook page Freelancer.Web.Id untuk update-update tutorial berikutnya.


Author: Arief Bayu Purwanto

Hello, my name is Arief Bayu Purwanto, a 24 years old father of a beautiful daughter. Interested in online programming, linux, games, and reading. Currently working on kapanlagi.com as junior developer. I live in a relatively quite and cool place called Malang. I'm available for some freelance stuff as well as some consulting job. You can see my portofolio for some previous task I've finished and some other information related to my capability. Btw, I'm plurking here.

  • Makasi tutorialnya bang,
    Ditunggu tutorial koneksi mysql dengan JDBC, dengan server di web hostingan sendiri.
    Saya sedang coba2 itu, tp blom berhasil.

    Semangat trus berbagi :)

    • I won’t recommend that. Kalau punya database di server, sebaiknya membuat API untuk mengakses data tersebut. Tidak dengan menambahkan JDBC di aplikasi android.

      Nanti saya coba buat tutorial untuk ini.

  • hezbyislami

    mas, ko pas mau diimport ke eclipse ga bisa?
    ada bacaan “no project are found to import”

    • Jangan pakai import. Pakai “New Android Project”, trus “Create project from existing source”

  • hezbyislami

    mas, ada tutorial untuk parsing latitude dan longitude dari sqlite ke map?

  • Septiyan Andika

    keren pak tutorialnya, di tunggu lanjutannya

  • Chandrapebri

    Gan kalo gw punya layout baru dan mau dibuka ketika klik salah satu menu di listmenu, bagaimana caranya?

    • yang jelas dong, pertanyaannya. layout baru yang gimana? listmenu maksudnya gimana, kliknya juga flownya gimana? aku kan bukan tukang ramal.

  • Resty

    gan,, mau nanya..
    gmn caranya pas diklik salah satu menu listnya muncul detail dari listnya..
    jadi misalnya kita udah insert data ‘Mangga’ dan muncul tuh di daftar,, kita klik ‘Mangga’nya maka muncul detail dr mangga itu gmn??

    pakai setItemOnClickListener kan?? Tapi ane bingung buat nyambungin ke databasenya sebelum bikin intent ke class detailnya.. udah ngutak atik tapi gag ngerti..

    mohon bantuannya yaa.. ;;)

  • Erlangga Bach

    bang,mau nanya dong,ane punya progam hitung berat,jadi misalnya ane input tinggi sama berat,pas diklik button hitung muncul hasil prosesnya berupa angka misalnya 24..nah saya mau nampilin ketika muncul angka 24 muncul pesan informasi mirip kaya toast/dialog message tapi pesan informasi yg muncul ada di layout xml..jadi ada beberapa kondisi untuk range nilai yang diproses misal 1-10 normal,11-20 stabil 20-30 obesitas..kira” caranya gimana ya gan?