Last Updated on 9 years ago by Mas Herdi
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.

mas, mau nanya, gimana ya biar saat tekan back (kembali ke acyivity sebelumnya), activity sebelumnya itu bisa langsung ke refresh databasenya. misal di activity 1 menampilkan data dari database, activity 2 mengupdate data dr database, saat setelah melakukan update data di activity 2, kemudian ditekan tombol back kan activity 2 hilang, saat kembali ke activity 1gimana caranya biar activity 1 tersebut menampilkan data yang sudah diupdate? mohon pencerahannya 😀
Mungkin bisa pada saat onCreate() kamu panggil lagi fungsi buat update listView-nya
gan, saya mau nanya. ko pas aplikasi yg saya buat, tidak bisa buat update data ya. maksudnya, masih tetep gitu walaupun udah diedit dan disimpan
ini class edit data saya:
package id.rumahbatik.database; 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; public class Edit extends Activity implements OnClickListener { private BuatCatatan buatCatatan; private long id; private String isi_tulisan; private EditText edit; private Button simpan; public Buku buku; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.edit); edit = (EditText) findViewById (R.id.edit); simpan = (Button) findViewById (R.id.simpan_edit); buatCatatan = new BuatCatatan(this); buatCatatan.open(); Bundle bun = this.getIntent().getExtras(); isi_tulisan = bun.getString("isi_tulisan"); edit.setText(isi_tulisan); simpan.setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch(v.getId()) { case R.id.simpan_edit: buku = new Buku(); buku.setIsi_tulisan(edit.getText().toString()); buku.setId(id); buatCatatan.updateBuku(buku); Intent i = new Intent(this, LihatCatatan.class); startActivity(i); Edit.this.finish(); buatCatatan.close(); break; } } }coba cek di logcat errornya apa
udah solved ko gan hehee…
makasih ya gan buat tutorial tutorialnya
mas mau tanya, ketika kita mau edit data, kan ada 3 field tuh di tampilan edit_data.xml nya. nah kan yg kelihatan di field edit datanya cuma nama barangnya aja mas. gmn cara nya biar field merk dan harga nya keliatan jg datanya pas mau di edit di layout edit_data.xml ? makasih :))
di bagian select datanya diambil juga parameter yang mau ditampilkan
di setContentView(R.layout.viewdata);, padahal udah ada di layoutnya “viewdata.xml ”
tapi masih error ” viewdata cannot be resolved or is not a field “
di setContentView(R.layout.viewdata);, padahal udah ada di layoutnya “viewdata.xml ”
tapi masih error ” viewdata cannot be resolved or is not a field “
mas kalo mau ambil button nya doang gimna
Gan makasih banyak tutorial agan sangat membantu sekali. Sukses terus buat agan
mas dah coba kan harusnya masuk bagian lihat data di klik terus muncul kaya piihan mau edit atau delete, mah ini opsinya ga muncul. di klik diem aja itu kenapa? dan ga ada error juga si.
Pakai long click gan, klik trus ditahan
gan kok ada eror di menu main.xml yaa???
error nya gimana lebih jelasnya?