Android SQLite Database CRUD Tutorial (IV) : Membuat Fungsi Update Data

Oke, sekarang kita sampai pada bagian ke empat tutorial CRUD pada database SQLite Android. Pada bagian keempat ini, kita akan melanjutkan pembuatan aplikasi inventaris barang pada Android menggunakan database SQLite dengan menlanjutkan belajar tentang bagaimana membuat fungsi edit/update data untuk mengedit data yang sudah dimasukkan ke dalam database SQLite.

Tentu saja, tutorial ini berhubungan dengan tutorial-tutorial sebelumnya. Seperti urutannya, Create, Read, Edit, dan Delete sudah ada tiga buah tutorial sebelumnya yang harus kalian baca. Kalian bisa menemukan indeks lengkap tutorial pada halaman ini. Atau bisa merujuk ke link prerequisites di bawah ini.

Pre Requisites

  • Tutorial membuat database SQLite Android (link)
  • Implementasi fitur Create Data (link)
  • Implementasi fitur Read Data (link)

Membuat Fitur Edit/Update Data pada SQLite Android

Sip, kita langsung saja. Fitur Update/Edit data ini dijalankan dengan pertama-tama melakukan long click item pada list view data. Yang kemudian akan memunculkan dialog dan kita bisa memilih untuk Edit data. Pertama-tama kita harus menambahkan dua buah method baru pada kelas controller yaitu kelas DBDataSource.java. Yaitu method untuk select data, dan yang kedua adalah method untuk update data.

Tambahkan method getBarang() berikut ini pada DBDataSource.java :

	//ambil satu barang sesuai id
	public Barang getBarang(long id)
	  {
		  Barang barang = new Barang(); //inisialisasi barang
		  //select query
		  Cursor cursor = database.query(DBHelper.TABLE_NAME, allColumns, "_id ="+id, null, null, null, null);
		  //ambil data yang pertama
		  cursor.moveToFirst();
		  //masukkan data cursor ke objek barang
		  barang = cursorToBarang(cursor);
		  //tutup sambungan
		  cursor.close();
		  //return barang
		  return barang;
	  }

Method itu akan mengambil satu barang berdasarkan id barang yang kita definisikan. Dan data yang sudah diambil itulah yang nantinya akan diedit.

Kemudian ini adalah method untuk update data, tambahkan juga pada DBDataSource.java

//update barang yang diedit
	public void updateBarang(Barang b)
	{
		//ambil id barang
		String strFilter = "_id=" + b.getId();
		//memasukkan ke content values
		ContentValues args = new ContentValues();
		//masukkan data sesuai dengan kolom pada database
		args.put(DBHelper.COLUMN_NAME, b.getNama_barang());
		args.put(DBHelper.COLUMN_MERK, b.getMerk_barang());
		args.put(DBHelper.COLUMN_HARGA, b.getHarga_barang() );
		//update query
		database.update(DBHelper.TABLE_NAME, args, strFilter, null);
	}

Dan inilah kelas lengkap DBSource.java setelah modifikasi :

package id.twooh.appinventory;

import java.util.ArrayList;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;

public class DBDataSource {

	//inisialiasi SQLite Database
	private SQLiteDatabase database;

	//inisialisasi kelas DBHelper
	private DBHelper dbHelper;

	//ambil semua nama kolom
	private String[] allColumns = { DBHelper.COLUMN_ID,
		      DBHelper.COLUMN_NAME, DBHelper.COLUMN_MERK,DBHelper.COLUMN_HARGA};

	//DBHelper diinstantiasi pada constructor
	public DBDataSource(Context context)
	{
		dbHelper = new DBHelper(context);
	}

	//membuka/membuat sambungan baru ke database
	public void open() throws SQLException {
	    database = dbHelper.getWritableDatabase();
	}

	//menutup sambungan ke database
	public void close() {
		dbHelper.close();
	}

	//method untuk create/insert barang ke database
	public Barang createBarang(String nama, String merk, String harga) {

		// membuat sebuah ContentValues, yang berfungsi
		// untuk memasangkan data dengan nama-nama
		// kolom pada database
	    ContentValues values = new ContentValues();
	    values.put(DBHelper.COLUMN_NAME, nama);
	    values.put(DBHelper.COLUMN_MERK, merk);
	    values.put(DBHelper.COLUMN_HARGA, harga);

	    // mengeksekusi perintah SQL insert data
	    // yang akan mengembalikan sebuah insert ID
	    long insertId = database.insert(DBHelper.TABLE_NAME, null,
	        values);

	    // setelah data dimasukkan, memanggil
	    // perintah SQL Select menggunakan Cursor untuk
	    // melihat apakah data tadi benar2 sudah masuk
	    // dengan menyesuaikan ID = insertID
	    Cursor cursor = database.query(DBHelper.TABLE_NAME,
	        allColumns, DBHelper.COLUMN_ID + " = " + insertId, null,
	        null, null, null);

	    // pindah ke data paling pertama
	    cursor.moveToFirst();

	    // mengubah objek pada kursor pertama tadi
	    // ke dalam objek barang
	    Barang newBarang = cursorToBarang(cursor);

	    //close cursor
	    cursor.close();

	    //mengembalikan barang baru
	    return newBarang;
	  }

	private Barang cursorToBarang(Cursor cursor)
	{
		// buat objek barang baru
		Barang barang = new Barang();
		// debug LOGCAT
		//Log.v("info", "The getLONG "+cursor.getLong(0));
		//Log.v("info", "The setLatLng "+cursor.getString(1)+","+cursor.getString(2));

		// Set atribut pada objek barang dengan
		// data kursor yang diambil dari database
		barang.setId(cursor.getLong(0));
		barang.setNama_barang(cursor.getString(1));
		barang.setMerk_barang(cursor.getString(2));
		barang.setHarga_barang(cursor.getString(3));

		//kembalikan sebagai objek barang
		return barang;
	}

	//mengambil semua data barang
	public ArrayList<Barang> getAllBarang() {
	    ArrayList<Barang> daftarBarang = new ArrayList<Barang>();

	    // select all SQL query
	    Cursor cursor = database.query(DBHelper.TABLE_NAME,
	        allColumns, null, null, null, null, null);

	    // pindah ke data paling pertama
	    cursor.moveToFirst();
	    // jika masih ada data, masukkan data barang ke
	    // daftar barang
	    while (!cursor.isAfterLast()) {
	      Barang barang = cursorToBarang(cursor);
	      daftarBarang.add(barang);
	      cursor.moveToNext();
	    }
	    // Make sure to close the cursor
	    cursor.close();
	    return daftarBarang;
	  }

	//ambil satu barang sesuai id
	public Barang getBarang(long id)
	  {
		  Barang barang = new Barang(); //inisialisasi barang
		  //select query
		  Cursor cursor = database.query(DBHelper.TABLE_NAME, allColumns, "_id ="+id, null, null, null, null);
		  //ambil data yang pertama
		  cursor.moveToFirst();
		  //masukkan data cursor ke objek barang
		  barang = cursorToBarang(cursor);
		  //tutup sambungan
		  cursor.close();
		  //return barang
		  return barang;
	  }

	//update barang yang diedit
	public void updateBarang(Barang b)
	{
		//ambil id barang
		String strFilter = "_id=" + b.getId();
		//memasukkan ke content values
		ContentValues args = new ContentValues();
		//masukkan data sesuai dengan kolom pada database
		args.put(DBHelper.COLUMN_NAME, b.getNama_barang());
		args.put(DBHelper.COLUMN_MERK, b.getMerk_barang());
		args.put(DBHelper.COLUMN_HARGA, b.getHarga_barang() );
		//update query
		database.update(DBHelper.TABLE_NAME, args, strFilter, null);
	}
}

Membuat View untuk edit data

Oke, setelah method pada kontroller ditambah. Sekarang kita akan membuat view untuk edit data. View tersebut mempunyai layout berupa tiga buah edit text untuk menampilkan data nama, merk dan harga barang. Kemudian dua buah tombol untuk save data yang sudah di-update dan tombol cancel.

Oiya, seperti biasa pertama-tama kita harus menambahkan beberapa resource string. Masukkan kode berikut pada res/values/string.xml. 

<resources>
    <string name="app_name">AppInventory</string>
    <string name="nama_app">twoh.co</string>
    <string name="hello_world">Hello world!</string>
    <string name="menu_settings">Settings</string>
    <string name="title_activity_main">AppInventory</string>
	<string name="barang_hint">Nama Barang</string>
	<string name="harga_hint">Harga Barang</string>
	<string name="merk_hint">Merk Barang</string>
	<string name="tombol_submit">Submit</string>
	<string name="tombol_tambah">Tambah Data</string>
	<string name="tombol_lihat">Lihat Data</string>
	<string name="tombol_edit">Save</string>
	<string name="tombol_cancel">Cancel</string>
	<string name="tombol_dialog_edit">Edit</string>
	<string name="tombol_dialog_delete">Delete</string>
	<string name="title_view">Data Barang</string>
	<string name="title_edit">Edit Barang | ID : </string>
</resources>

Setelah itu, kita buat layout file baru bernama edit_data.xml. File ini adalah layout untuk Edit View. Tambahkan kode berikut pada edit_data.xml.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <TextView
        android:id="@+id/text_id_barang"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/title_edit"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="15dp"
       	android:background="#0000ff"
        />
    <EditText
        android:id="@+id/editText_nama"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:layout_marginTop="15dp"
        android:background="#afffffff"
        android:layout_below="@id/text_id_barang"
        >
        <requestFocus />
    </EditText>
    <EditText
        android:id="@+id/editText_merk"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:layout_marginTop="15dp"
        android:background="#afffffff"
        android:layout_below="@id/editText_nama"
         />
    <EditText
        android:id="@+id/editText_harga"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="number"
        android:ems="10"
        android:layout_marginTop="15dp"
        android:background="#afffffff"
        android:layout_below="@id/editText_merk"
        />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:gravity="center"
        android:layout_below="@id/editText_harga"
        >
        <Button
        android:id="@+id/button_save_update"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/tombol_edit"
        />

    <Button
        android:id="@+id/button_cancel_update"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/tombol_cancel"
        />
    </LinearLayout>
</RelativeLayout>

Update kelas View Data

Sip, jika sudah, kita sekarang akan mengupdate kelas ViewData.java. Kita akan menambahkan method OnItemLongClickListener pada item di ListView. Suapaya apabila kita melakukan long click/klik yang panjang, akan ada dialog muncul. Oiya, sebelumnya kita akan membuat layout untuk dialog terlebih dahulu. Buat sebuah file xml baru bernama dialog_view.xml. Kemudian copy pastekan kode berikut.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:gravity="center"
    >

    <Button
        android:id="@+id/button_edit_data"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/tombol_dialog_edit"
        />

    <Button
        android:id="@+id/button_delete_data"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/tombol_dialog_delete"
        />
</LinearLayout>

Kemudian, buka file ViewData.xml dan ganti dengan kode berikut

package id.twooh.appinventory;

import java.util.ArrayList;
import android.app.Dialog;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

public class ViewData extends ListActivity implements OnItemLongClickListener {

	//inisialisasi kontroller
	private DBDataSource dataSource;

	//inisialisasi arraylist
	private ArrayList<Barang> values;
	private Button editButton;
	private Button delButton;

	@Override
	public void onCreate(Bundle savedInstanceState) {
	      super.onCreate(savedInstanceState);
	      setContentView(R.layout.viewdata);
	      dataSource = new DBDataSource(this);
	      // buka kontroller
	      dataSource.open();

	      // ambil semua data barang
	      values = dataSource.getAllBarang();

	      // masukkan data barang ke array adapter
	      ArrayAdapter<Barang> adapter = new ArrayAdapter<Barang>(this,
	      android.R.layout.simple_list_item_1, values);

	      // set adapter pada list
	      setListAdapter(adapter);

	      // mengambil listview untuk diset onItemLongClickListener
	      ListView lv = (ListView) findViewById(android.R.id.list);
	      lv.setOnItemLongClickListener(this);
	}

	//apabila ada long click
	@Override
	public boolean onItemLongClick(final AdapterView<?> adapter, View v, int pos,
			final long id) {

		//tampilkan alert dialog
		final Dialog dialog = new Dialog(this);
		dialog.setContentView(R.layout.dialog_view);
		dialog.setTitle("Pilih Aksi");
		dialog.show();
		final Barang b = (Barang) getListAdapter().getItem(pos);
		editButton = (Button) dialog.findViewById(R.id.button_edit_data);
	    delButton = (Button) dialog.findViewById(R.id.button_delete_data);

	    //apabila tombol edit diklik
	    editButton.setOnClickListener(
				new OnClickListener()
				{
					@Override
					public void onClick(View v) {
						// TODO Auto-generated method stub
						switchToEdit(b.getId());
						dialog.dismiss();
					}
				}
				);
		return true;
	}
	//method untuk edit data
	public void switchToEdit(long id)
	{
		Barang b = dataSource.getBarang(id);
		Intent i = new Intent(this, EditData.class);
		Bundle bun = new Bundle();
		bun.putLong("id", b.getId());
		bun.putString("nama", b.getNama_barang());
		bun.putString("merk", b.getMerk_barang());
		bun.putString("harga", b.getHarga_barang());
		i.putExtras(bun);
		finale();
		startActivity(i);
	}
        //method yang dipanggil ketika edit data selesai
	public void finale()
	{
		ViewData.this.finish();
		dataSource.close();
	}
	@Override
	protected void onResume() {
		dataSource.open();
		super.onResume();
	}

	@Override
	protected void onPause() {
	    dataSource.close();
	    super.onPause();
	}

}

Oke, dari kode di atas kita bisa lihat bahwa sebagian besar perubahan ada pada fungsi untuk mengeset OnClickListener pada item di listview. Jadi cara kerjanya, apabila list item diklik dan kemudian ditahan klik itu (long click), nanti akan muncul alert dialog yang memberikan pilihan kepada kita. Apakah ingin delete data, atau edit data. Apabila kita mengklik tombol edit data, maka kita akan dibawa ke activity untuk edit data. 🙂

Membuat Activity Class EditData.java

Kita hampir selesai. 😀 Karena kita sudah membuat layout xml untuk edit data, sekarang kita akan membuat activity-nya. Buat file java baru bernama EditData.java. Kemudian copy pastekan kode berikut :

package id.twooh.appinventory;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class EditData extends Activity implements OnClickListener{

	private DBDataSource dataSource;

	private long id;
	private String harga;
	private String merk;
	private String nama;

	private EditText edNama;
	private EditText edHarga;
	private EditText edMerk;

	private TextView txId;

	private Button btnSave;
	private Button btnCancel;

	private Barang barang;

	@Override
	public void onCreate(Bundle savedInstanceState) {
	      super.onCreate(savedInstanceState);
	      setContentView(R.layout.edit_data);
              //inisialisasi variabel
	      edNama = (EditText) findViewById(R.id.editText_nama);
	      edHarga = (EditText) findViewById(R.id.editText_harga);
	      edMerk = (EditText) findViewById(R.id.editText_merk);
	      txId = (TextView) findViewById(R.id.text_id_barang);
	      //buat sambungan baru ke database
	      dataSource = new DBDataSource(this);
	      dataSource.open();
	      // ambil data barang dari extras
	      Bundle bun = this.getIntent().getExtras();
	      id = bun.getLong("id");
	      harga = bun.getString("harga");
	      merk = bun.getString("merk");
	      nama = bun.getString("nama");
	      //masukkan data-data barang tersebut ke field editor
	      txId.append(String.valueOf(id));
	      edNama.setText(nama);
	      edHarga.setText(harga);
	      edMerk.setText(merk);

	      //set listener pada tombol
	      btnSave = (Button) findViewById(R.id.button_save_update);
	      btnSave.setOnClickListener(this);
	      btnCancel = (Button) findViewById(R.id.button_cancel_update);
	      btnCancel.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch(v.getId())
		{
                        // apabila tombol save diklik (update barang)
			case R.id.button_save_update :
				barang = new Barang();
				barang.setHarga_barang(edHarga.getText().toString());
				barang.setNama_barang(edNama.getText().toString());
				barang.setMerk_barang(edMerk.getText().toString());
			    barang.setId(id);
				dataSource.updateBarang(barang);
				Intent i = new Intent(this, ViewData.class);
				startActivity(i);
				EditData.this.finish();
				dataSource.close();
				break;
                        // apabila tombol cancel diklik, finish activity
			case R.id.button_cancel_update :
				finish();
				dataSource.close();
				break;
		}
	}
}

Activity EditData.java pada dasarnya berfungsi untuk mengambil data barang yang mau diedit, seperti nama, merk, dan harga. Untuk kemudian data tersebut ditempatkan pada field EditText supaya bisa kita ganti. Setelah selesai, maka kita mengklik tombol Save dan kemudian activity akan memanggil method updateBarang() pada kontroller, yang akan melakukan update data lewat SQL Query.

Tambah activity EditData.java ke Android Manifest

Yang terakhir adalah menambahkan activity EditData di atas ke Android Manifest. Buka file AndroidManifest.xml dan copy pastekan kode berikut.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="id.twooh.appinventory"
    android:versionCode="3"
    android:versionName="1.0.0.4a" >

    <uses-permission
         android:name="android.permission.INTERNET" />
   	<uses-permission
         android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:allowBackup="true"
        >
        <activity
            android:name="id.twooh.appinventory.CreateData"
            android:label="@string/title_activity_main" >
        </activity>
        <activity
            android:name=".Menu"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ViewData"
            android:label="@string/title_activity_main" >
        </activity>
        <activity
            android:name=".EditData"
            android:label="@string/title_activity_main" >
        </activity>
    </application>

</manifest>

That’s all. 😉 Aplikasi inventaris barang kalian sekarang sudah punya fitur untuk update data!

Demo

Untuk demo aplikasinya, silahkan kalian download aplikasi AppInventory ini di Google Play Store. Semoga bermanfaat.

15 Comments

  1. @umialfah August 23, 2013
    • Hafizh Herdi Naufal August 23, 2013
  2. Cydonia December 7, 2013
    • Hafizh Herdi Naufal December 17, 2013
      • Cydonia December 28, 2013
  3. theo February 28, 2014
    • Hafizh Herdi Naufal March 12, 2014
      • yusup March 14, 2014
  4. yusup March 14, 2014
  5. harris March 20, 2014
  6. Reza Koraag July 7, 2014
  7. robert September 25, 2014
  8. dhelina December 8, 2014

Leave a Reply

Do NOT follow this link or you will be banned from the site!