Menyimpan Data ke Database

Pada latihan-latihan sebelumnya, semua teknik yang digunakan adalah untuk menyimpan data yang sederhana. Untuk menyimpan data relasional, akan jauh lebih efisien menggunakan database. Misalnya, bila kita ingin menyimpan data hasil ujian siswa di sekolah, akan jauh lebih efisien apabila kita menggunakan database untuk menyajikannya karena kita bisa melakukan query ke database untuk menampilkan hasil-hasil ujian siswa. Selain itu dengan menggunakan database kita bisa menerapkan integritas data dengan menetapkan relationships antar dataset.

Android menggunakan sistem database SQLite. Database yang kita buat untuk app kita hanya bisa diakses oleh app itu sendiri, app yang lain tidak akan bisa mengaksesnya.

Di Android, database SQLite yang kita buat akan selalu disimpan di folder "/data/data//databases."


Praktik yang baik bila kita ingin menggunakan database di Android adalah dengan cara membuat class pembantu (class untuk membantu mempermudah pekerjaan) untuk men-encapsulasi semua kompleksitas dalam mengakses database sehingga mudah dipanggil oleh kode-kode kita. Dalam latihan ini kita akan membuat class pembantu terlebih dahulu yang kita beri nama class DBAdapter yang berfungsi untuk membuat, membuka, menutup, dan mengakses database SQLite.

Dalam latihan ini kita akan membuat database dengan nama MyDB yang berisi satu table dengan nama tabel 'contacts'. Tabel ini akan berisi tiga kolom yaitu: _id, name, dan email.

File java: DBAdapter.java (berfungsi sebagai class pembantu):
package com.example.savingtodb; 
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log; 
public class DBAdapter {
static final String KEY_ROWID = "_id";
static final String KEY_NAME = "name";
static final String KEY_EMAIL = "email";
static final String TAG = "DBAdapter";
static final String DATABASE_NAME = "MyDB";
static final String DATABASE_TABLE =" contacts";
static final int DATABASE_VERSION = 1; 
static final String DATABASE_CREATE = "create table contacts (_id integer primary key autoincrement, "
+  "name text not null, email text not null);"; 
final Context context;
DatabaseHelper DBHelper;
SQLiteDatabase db; 
public DBAdapter(Context ctx){
this.context = ctx;
DBHelper = new DatabaseHelper(context);
private static class DatabaseHelper extends SQLiteOpenHelper
{
DatabaseHelper(Context context)
{
super(context, DATABASE_NAME,null,DATABASE_VERSION);
@Override
public void onCreate(SQLiteDatabase db)
{
try {
db.execSQL(DATABASE_CREATE);
}
catch (SQLException sqle){
sqle.printStackTrace();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
Log.w(TAG,"Upgrading database from version " + oldVersion + " to " + newVersion +
", which will destroy all old data");
db.execSQL("DROP TABLE IF EXIST contacts");
onCreate(db);
}
//--open database--
public DBAdapter open() throws SQLException
{
db = DBHelper.getWritableDatabase();
return this;
//--close database--
public void close()
{
DBHelper.close();
//--insert a contact into database--
public long insertContact(String name, String email)
{
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_NAME, name);
initialValues.put(KEY_EMAIL, email);
return db.insert(DATABASE_TABLE,null, initialValues);
//--delete particular contact--
public boolean deleteContact(long rowId) {
return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
//--retrieves all contacts--
public Cursor getAllContacts()
{
return db.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME, KEY_EMAIL}, null, null, null, null,null);
//--retrieves particular contact--
public Cursor getContact(long rowId) throws SQLException
{
Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,KEY_NAME,KEY_EMAIL}, KEY_ROWID
+ "=" + rowId, null,null,null,null,null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
//--updates a contact--
public boolean updateContact(long rowId, String name, String email)
{
ContentValues args = new ContentValues();
args.put(KEY_NAME, name);
args.put(KEY_EMAIL, email);
return db.update(DATABASE_TABLE,args, KEY_ROWID + "=" + rowId, null) > 0;
}
}

Penjelasan:

Kita membuat beberapa konstanta terlebiih dahulu yang berisi berbagai field/kolom untuk tabel yang akan kita buat di dala database. Khusus untuk konstanta 'DATABASE_CREATE' berisi statement SQL untuk membuat tabel 'contacts' di dalam database MyDB.

Di dalam class DBAdapter kita juga tambahkan private class yang menerapkan 'extends' class 'SQLiteOpenHelper' yang merupakan class pembantu di Android untuk menegelola pembuatan database dan manajemen versi. Biasanya kita akan 'override' method-method 'onCreate()' dan 'onUpgrade()'.

Method 'onCreate()' membuat database baru bila database yang diperlukan tidak ada. Method 'onUpgrade()' dipanggil bila database perlu di-upgrade. Hal ini dijalankan dengan melakukan cek nilai yang ada di konstanta 'DATABASE_VERSION'. Untuk implementasi method 'onUpgrade()', kita cukup dengan melakukan drop tabel dan membuatnya lagi.

Kita kemudian bisa membuat berbagai method untuk membuka dan menutup database, dan juga method-method untuk menambah/mengedit/menghapus baris di tabel.

Harap diperhatikan bahwa Android menggunakan class 'Cursor' sebagai nilai kembalian dari query. Dengan menggunakan 'Cursor' memungkinkan Android untuk mengelola baris dan kolom secara lebih efisien.

Kita menggunakan object 'ContentValues' untuk menyimpan pasangan nama-dan-value. Method 'put()' memungkinkan kita meng-insert berbagai macam key dan nilainya dari berbagai macam jenis data.

Menambahkan Data ke Tabel 'contacts'

File java: MainActivity.java:
package com.example.savingtodb;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle; 
public class MainActivity extends AppCompatActivity { 
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DBAdapter db = new DBAdapter(this); 
//--add a contact--
db.open();
long id = db.insertContact("Ning", "lastevening@yahoo.com");
id = db.insertContact("Ega","avds@gmail.com");
db.close();
}
}
Penjelasan:

Pada kode di atas kita sudah membuat instans dari class DBAdapter:
DBAdapter db = new DBAdapter(this);
Method 'insertContact()' akan mengembalikan/menghasilkan ID dari baris yang dimasukkan. Bila terjadi error selama dalam proses insert data tersebut, method tersebut akan mengembalikan nilai -1.

Bila kita lihat dengan DDMS, maka sudah ada database MyDB yang dibuat dalam folder database seperti gambar di bawah ini.
Database MyDB dilihat dengan menggunakan DDMS

No comments: