Last Updated on 8 years 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:
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?