Sesuai janji saya di akhir artikel Android Membuat Custom ListView maka pada tulisan ini saya akan menulis mengenai pemrograman database pada Android menggunakan SQLite database. Android mempunyai beberapa teknik untuk menyimpan data, dari yang sangat sederhana menggunakan Intent, kemudian SharedPreferences dan yang akan dibahas disini,SQLite database.
Struktur Tabel
Tutorial ini menggunakan tabel dengan nama t_buku yang digunakan untuk menyimpan data buku. Berikut ini adalah struktur dari tabel tersebut.
1. kolom id dengan tipe Integer dan sekaligus sebagai Primary Key
2. kolom judul dengan tipe TEXT
3. kolom penulis dengan tipe TEXT
Kelas Domain
Seperti biasa ketika akan melakukan operasi yang berhubungan dengan suatu data maka kita modelkan data tersebut menjadi sebuah kelas Java. Pada kasus ini kita akan berurusan dengan data buku, maka kita buat sebuah kelas dengan nama Buku beserta property-nya yang menyesuaikan dengan kolom pada tabel yang telah kita buat diatas.
Berikut ini adalah kodenya
file : Buku.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
package com.agungsetiawan.androiddatabase.domain; public class Buku { private int id; private String judul; private String penulis; public Buku(){} public Buku(String judul,String penulis){ this.judul=judul; this.penulis=penulis; } public Buku(int id,String judul,String penulis){ this.id=id; this.judul=judul; this.penulis=penulis; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getJudul() { return judul; } public void setJudul(String judul) { this.judul = judul; } public String getPenulis() { return penulis; } public void setPenulis(String penulis) { this.penulis = penulis; } } |
Database Handler
Untuk akses ke database kita buat sebuah kelas yang khusus menangani operasi-operasi database (CRUD). Android menyediakan sebuah kelas helper yang bernama SQLiteOpenHelper untuk memudahkan kita dalam membuat kelas database handler.
Buat sebuah kelas dengan nama DatabaseHandler yang merupakan turunan dari SQLiteOpenHelper
1 2 |
public class DatabaseHandler extends SQLiteOpenHelper { } |
Kita perlu melakukan override terhadap dua method yaitu onCreate dan onUpdate. onCreate dijalankan untuk membuat sebuah tabel baru, method ini dijalankan ketika database pertama kali dibuat, sedangkan onUpdate digunakan untuk memperbaharui tabel seperti mengganti struktur tabel dan lain sebagainya.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
@Override public class DatabaseHandler extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 1; private static final String DATABASE_NAME = "BukuManager"; private static final String TABLE_BUKU = "t_buku"; private static final String KEY_ID = "id"; private static final String KEY_JUDUL = "judul"; private static final String KEY_PENULIS = "penulis"; public DatabaseHandler(Context context){ super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { String CREATE_BUKU_TABLE = "CREATE TABLE " + TABLE_BUKU + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_JUDUL + " TEXT," + KEY_PENULIS + " TEXT" + ")"; db.execSQL(CREATE_BUKU_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TABLE_BUKU); onCreate(db); } } |
⇒Operasi CRUD
Selanjutnya kita akan menulis method-method yang digunakan untuk proses manipulasi database. Berikut adalah method yang akan kita buat implementasinya
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// method untuk menyimpan buku public void save(Buku buku) // method untuk mendapatkan satu data buku public Buku findOne(int id) // method untuk mendapatkan semua data buku public List<Buku> findAll() // method untuk mengupdate data buku public void update(Buku buku) //method untuk menghapus data buku public void delete(Buku buku) |
Poin-poin selanjutnya akan membahas implementasi dari method-method diatas.
⇒Memasukkan Data
Method save() digunakan untuk menyimpan data baru kedalam database. Method ini mempunyai parameter berupa objek dari kelas Buku. ContentValues digunakan untuk memberikan nilai pada kolom tabel. Selanjutnya proses menyimpan data tinggal memanggil method insert() yang dimiliki oleh SQLiteOpenHelper
1 2 3 4 5 6 7 8 9 |
public void save(Buku buku){ SQLiteDatabase db=this.getWritableDatabase(); ContentValues values=new ContentValues(); values.put(KEY_JUDUL, buku.getJudul()); values.put(KEY_PENULIS, buku.getPenulis()); db.insert(TABLE_BUKU, null, values); db.close(); } |
⇒Mengambil Satu Data
Method berikut ini bertugas mengambil satu baris data pada database dengan parameter yang dimiliki berupa id. Method ini akan mengembalikan sebuah objek kelas Buku yang memiliki id yang sesuai dengan parameter.
1 2 3 4 5 6 7 8 9 10 11 |
public Buku findOne(int id){ SQLiteDatabase db=this.getReadableDatabase(); Cursor cursor=db.query(TABLE_BUKU, new String[]{KEY_ID,KEY_JUDUL,KEY_PENULIS}, KEY_ID+"=?", new String[]{String.valueOf(id)}, null, null, null); if(cursor!=null){ cursor.moveToFirst(); } return new Buku(Integer.parseInt(cursor.getString(0)),cursor.getString(1),cursor.getString(2)); } |
⇒Mengambil Semua Data
Mengambil semua data yang ada pada database perlu melakukan perulangan pada Cursor untuk kemudian mengubahnya menjadi objek buku dan dimasukkan pada sebuah list.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public List<Buku> findAll(){ List<Buku> listBuku=new ArrayList<Buku>(); String query="SELECT * FROM "+TABLE_BUKU; SQLiteDatabase db=this.getReadableDatabase(); Cursor cursor=db.rawQuery(query, null); if(cursor.moveToFirst()){ do{ Buku buku=new Buku(); buku.setId(Integer.valueOf(cursor.getString(0))); buku.setJudul(cursor.getString(1)); buku.setPenulis(cursor.getString(2)); listBuku.add(buku); }while(cursor.moveToNext()); } return listBuku; } |
⇒Mengupdate Data
Method berikut akan memperbaharui data pada database.
1 2 3 4 5 6 7 8 9 10 |
public void update(Buku buku){ SQLiteDatabase db=this.getWritableDatabase(); ContentValues values=new ContentValues(); values.put(KEY_JUDUL, buku.getJudul()); values.put(KEY_PENULIS, buku.getPenulis()); db.update(TABLE_BUKU, values, KEY_ID+"=?", new String[]{String.valueOf(buku.getId())}); db.close(); } |
⇒Menghapus Data
Dan terakhir adalah method delete() yang digunakan untuk menghapus data pada database
1 2 3 4 5 |
public void delete(Buku buku){ SQLiteDatabase db=this.getWritableDatabase(); db.delete(TABLE_BUKU, KEY_ID+"=?", new String[]{String.valueOf(buku.getId())}); db.close(); } |
Database Handler Lengkap
Setelah potongan-potongan kode diatas disatukan maka berikut ini adalah kode dari kelas DatabaseHandler yang lengkap
file : DatabaseHandler.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
package com.agungsetiawan.androiddatabase.database; import java.util.ArrayList; import java.util.List; import com.agungsetiawan.androiddatabase.domain.Buku; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DatabaseHandler extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 1; private static final String DATABASE_NAME = "BukuManager"; private static final String TABLE_BUKU = "t_buku"; private static final String KEY_ID = "id"; private static final String KEY_JUDUL = "judul"; private static final String KEY_PENULIS = "penulis"; public DatabaseHandler(Context context){ super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { String CREATE_BUKU_TABLE = "CREATE TABLE " + TABLE_BUKU + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_JUDUL + " TEXT," + KEY_PENULIS + " TEXT" + ")"; db.execSQL(CREATE_BUKU_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TABLE_BUKU); onCreate(db); } public void save(Buku buku){ SQLiteDatabase db=this.getWritableDatabase(); ContentValues values=new ContentValues(); values.put(KEY_JUDUL, buku.getJudul()); values.put(KEY_PENULIS, buku.getPenulis()); db.insert(TABLE_BUKU, null, values); db.close(); } public Buku findOne(int id){ SQLiteDatabase db=this.getReadableDatabase(); Cursor cursor=db.query(TABLE_BUKU, new String[]{KEY_ID,KEY_JUDUL,KEY_PENULIS}, KEY_ID+"=?", new String[]{String.valueOf(id)}, null, null, null); if(cursor!=null){ cursor.moveToFirst(); } return new Buku(Integer.parseInt(cursor.getString(0)),cursor.getString(1),cursor.getString(2)); } public List<Buku> findAll(){ List<Buku> listBuku=new ArrayList<Buku>(); String query="SELECT * FROM "+TABLE_BUKU; SQLiteDatabase db=this.getReadableDatabase(); Cursor cursor=db.rawQuery(query, null); if(cursor.moveToFirst()){ do{ Buku buku=new Buku(); buku.setId(Integer.valueOf(cursor.getString(0))); buku.setJudul(cursor.getString(1)); buku.setPenulis(cursor.getString(2)); listBuku.add(buku); }while(cursor.moveToNext()); } return listBuku; } public void update(Buku buku){ SQLiteDatabase db=this.getWritableDatabase(); ContentValues values=new ContentValues(); values.put(KEY_JUDUL, buku.getJudul()); values.put(KEY_PENULIS, buku.getPenulis()); db.update(TABLE_BUKU, values, KEY_ID+"=?", new String[]{String.valueOf(buku.getId())}); db.close(); } public void delete(Buku buku){ SQLiteDatabase db=this.getWritableDatabase(); db.delete(TABLE_BUKU, KEY_ID+"=?", new String[]{String.valueOf(buku.getId())}); db.close(); } } |
Kelas Activity
Kelas untuk proses manipulasi database sudah kita buat, sekarang saatnya bagi kita menggunakannya. Pada Activity ini kita hanya akan mengecek apakah kelas DatabaseHandler sudah berfungsi sebagaimana mestinya dalam artian tiap method yang dimiliki benar-benar berjalan dengan baik. Method save() benar menyimpan data atau tidak, method delete() benar-benar menghapus data atau tidak dan method-method lainnya. Kali ini kita hanya akan mengeceknya secara manual menggunakan fitur LogCat di Eclipse. Untuk cara canggihnya menggunakan integration test yang akan saya bahas pada tulisan-tulisan mendatang.
Oke jadi seperti inilah kelas Activity kita
file : BukuActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
package com.agungsetiawan.androiddatabase; import java.util.List; import com.agungsetiawan.androiddatabase.database.DatabaseHandler; import com.agungsetiawan.androiddatabase.domain.Buku; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.view.Menu; public class BukuActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_buku); DatabaseHandler databaseHandler=new DatabaseHandler(this); Log.d("insert", "inserting data"); databaseHandler.save(new Buku("Java Good", "Agung Setiawan")); databaseHandler.save(new Buku("Web Design Good","Hauril Maulida Nisfari")); Log.d("reading", "reading all data"); List<Buku> listBuku=databaseHandler.findAll(); for(Buku b:listBuku){ Log.d("data", "ID :"+b.getId()+" | JUDUL :"+b.getJudul()+" | PENULIS:"+b.getPenulis()); } Log.d("reading","reading one data"); Buku b=databaseHandler.findOne(2); Log.d("data", "ID :"+b.getId()+" | JUDUL :"+b.getJudul()+" | PENULIS:"+b.getPenulis()); Log.d("update","updating data"); b.setJudul("Web Design Good Second Edition"); databaseHandler.update(b); Log.d("reading","reading one data after update"); Buku bUpdate=databaseHandler.findOne(2); Log.d("data", "ID :"+bUpdate.getId()+" | JUDUL :"+bUpdate.getJudul()+" | PENULIS:"+bUpdate.getPenulis()); Log.d("delete", "deleting data"); databaseHandler.delete(b); Log.d("reading", "reading all data after delete"); List<Buku> listBuku2=databaseHandler.findAll(); for(Buku b2:listBuku2){ Log.d("data", "ID :"+b2.getId()+" | JUDUL :"+b2.getJudul()+" | PENULIS:"+b2.getPenulis()); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.buku, menu); return true; } } |
Hasil Log
Berikut ini adalah hasil log dari aplikasi kita. Coba perhatikan hasilnya, dari disitu dapat disimpulkan bahwa DatabaseHandler sudah berfungsi dengan benar.
Penutup
Sampai disini kita sudah berhasil membuat sebuah kelas yang bertugas untuk melakukan proses manipulasi pada database. Semoga tutorial ini bermanfaat.
Pada tulisan berikutnya kita akan menggabungkan apa yang telah dipelajari hari ini dengan GUI pada Android sehingga untuk proses save, edit, finOne dan delete bisa melalui antarmuka tersebut :D.
mas ini cara simpan listview ke database sql lite ya..?
untung nyasar kesini. baru kali ini dapet tutorial yg langsung ngakar dipahami nih. thankyouuu.
ayo mas, smg punya banyak waktu luang buat bikin next tutornya.. pasti banyak yg nunggu nih buat GUInya sekalian.
😀
mas gmna kalau kita mau buat 2 atau 3 database baru, gmna cara ya dan apakah kita harus buat class activity dan Database Handler ya 3 juga. tolong pencerahan ya…..
makasih pak,lanjutkan sharing ilmu…