Monday, 27 June 2016

Cara Menggunakan Database Sugar ORM di Android

Sebuah aplikasi yang kita buat pada level advance pasti menggunakan tempat penyimpanan atau storage baik itu sementara ataupun permanen. Dalam pemrograman web kita bisa gunakan MySql, kita cukup menuliskan Querynya saja agar bisa memanggil apa yang kita mau.


Sedangkan pada mobile, khususnya Android, terdapat banyak cara melakukan proses penyimpanan di database SqlLite. Biasanya menyimpan data dimobile itu bersifat sementara saja, karena semua dikirim ke server dengan format json.

Baca (Cara Penyimpanan Data di SharedPreference dan Intent)

Kalau kita menggunakan cara penyimpanan manual ke SqlLite, saya merasakannya cukup ribet, jadi untuk yang baru belajar mungkin akan kesulitan mengertinya. Untuk mengatasi hal tersebut, ada sebuah library yang dapat membantu kita menyimpan data di database mobile yaitu menggunakan ORM Sugar [Official Site nya], jika diperhatikan dengan baik, library ini sangat memudahkan kita dalam proses penyimpanan data, hapus data dan update.
Tapi ingat, dari beberapa sumber yang saya baca, ORM Sugar ini masih digunakan untuk Database-database yang sederhana
Pertama yang harus dilakukan adalah meng compile library ORM Sugar di build.gradle (app) :

compile 'com.github.satyan:sugar:1.4'

Buat Application.java yang meng extends SugarApp, seperti dibawah ini :

package com.example.putuguna.databasesugar;

import com.orm.SugarApp;

/**
 * Created by putuguna on 27/06/16.
 */
public class Application extends SugarApp {

    @Override
    public void onCreate() {
        super.onCreate();
    }
}

Kemudian setting AndroidManifest.xml kalian, tambahkan beberapa meta-tag di dalam Applikasi dan berikan nama pada Application. Nama Application nya adalah class aplication yang sudah dibuat :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.putuguna.databasesugar">

    <application
        android:name=".Application"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <meta-data android:name="DATABASE" android:value="putugunacompo.db"/>
        <meta-data android:name="VERSION" android:value="8"/>
        <meta-data android:name="QUERY_LOG" android:value="true"/>
        <meta-data android:name="DOMAIN_PACKAGE_NAME" android:value="com.example.putuguna.databasesugar"/>

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Ada beberapa meta-data didalam manifest, kalian harus paham satu per satu
  1. DATABASE = sudah jelas nama Database yang kalian akan gunakan, format.db
  2. VERSION = pada awal kalian membuat database isikan angka 1, tapi ketika kalian sempat merubah komponen-komponennya seperti nama database, table database, field, kalian HARUS menaikan versinya menjadi 2, begitu seterusnya
  3. QUERY_LOG = bisa diset true atau false, ini digunakan untuk proses dibugging query pada aplikasi
  4. DOMAIN_PACKAGE_NAME = Isikan nama package kalian.
Selanjutnya, buat java class yang meng extends SugarRecord yang akan kita gunakan sebagai Table, beri nama Dataprofile.java

package com.example.putuguna.databasesugar;

import com.orm.SugarRecord;

/**
 * Created by putuguna on 27/06/16.
 */
public class Dataprofile extends SugarRecord {

    private String owner;
    private String profession;

    public Dataprofile(String owner, String profession) {
        this.owner = owner;
        this.profession = profession;
    }

    public Dataprofile() {
    }

    public String getOwner() {
        return owner;
    }

    public void setOwner(String owner) {
        this.owner = owner;
    }

    public String getProfession() {
        return profession;
    }

    public void setProfession(String profession) {
        this.profession = profession;
    }
}

Ingat lagi, ketika kalian nantinya merubah apapun di file java ini (Dataprofile.java), VERSION databasenya harus kalian naikan juga.

Sebelum masuk ke MainActivity.java terlebih dahulu kita siapkan layoutnya. Disini saya beri mana activity_main.xml, kodingannya begini :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.example.putuguna.databasesugar.MainActivity">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/owner"
        android:hint="owner"/>
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/profession"
        android:hint="Profession"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Save Data"
        android:id="@+id/save"/>

    <ListView
        android:layout_marginTop="10dp"
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>

</LinearLayout>

Terakhir kita buat MainActivity.java. Untuk menyimpan data cukup kita gunakan dataprofile.save(); 

package com.example.putuguna.databasesugar;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import com.orm.SugarRecord;

import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private EditText mOwner;
    private EditText mProfession;
    private Button mButtonSave;
    private ArrayAdapter<Dataprofile> mAdapter;
    private ListView mListview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        mOwner = (EditText) findViewById(R.id.owner);
        mProfession = (EditText)  findViewById(R.id.profession);
        mButtonSave = (Button) findViewById(R.id.save);
        mListview = (ListView) findViewById(R.id.listview);

        mButtonSave.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        int id = v.getId();
        if(id==R.id.save){

            String owner = mOwner.getText().toString();
            String profession = mProfession.getText().toString();

            Dataprofile dataProfleOwner = new Dataprofile(owner, profession);
            dataProfleOwner.save();

            List<Dataprofile> allData = SugarRecord.listAll(Dataprofile.class);
            mAdapter = new ArrayAdapter<Dataprofile>(MainActivity.this, android.R.layout.simple_list_item_1,allData);
            mAdapter.notifyDataSetChanged();
            mListview.setAdapter(mAdapter);

            Toast.makeText(this, "Data berhasil disimpan", Toast.LENGTH_LONG).show();
        }
    }
}

Berikut ini adalah beberapa operasi yang dapat dilakukan ORM Sugar :

DELETE


Untuk Delete semua data dalam dalam table, gunakan perintah berikut :

 SugarRecord.deleteAll(Dataprofile.class);

Untuk delete data berdasarkan clause tertentu, kalian bisa gunakan seperti ini

Dataprofile.deleteAll(Dataprofile.class,"owner = ?", "Putu Guna");

Kode diatas, akan mendelete semua data yang memiliki owner Putu Guna
Atau bisa juga seperti ini caranya untuk mendelete berdasarkan ID (ID hasil auto increment) :

Dataprofile profile = Dataprofile.findById(Dataprofile.class, 23L);
            profile.delete();

MENAMPILKAN


Untuk menampilkan data berdasarkan ID (ID ini tercipta berdasarkan Auto Increment di database) :

Dataprofile findById = SugarRecord.findById(Dataprofile.class, (long)1);

Kode diatas maksudnya, kita akan menampilkan field-filed yang mempunyai ID 1

Untuk menampilkan data berdasarkan clause tertentu (misalnya berdasarkan nama, pekerjaan atau lainnya), bisa gunakan seperti ini :

List<Dataprofile> findWithArguments = SugarRecord.find(Dataprofile.class, "owner = ?", "Putu Guna");

Atau ,

List<Dataprofile> findWithCustomQuery = SugarRecord.findWithQuery(Dataprofile.class, "SELECT * FROM Dataprofile WHERE owner = ?", "Putu Joli Artaguna");

Atau,

List<Dataprofile> findWIthQueryBuilder = Select.from(Dataprofile.class).where(Condition.prop("owner").eq("Putu Guna")).list();

UPDATE


Untuk memperbaharui data berdasarkan ID, gunakan berikut ini :

Dataprofile dataprofile = Dataprofile.findById(Dataprofile.class, 1);
            dataprofile.setOwner("update nama owner si ID 1 disini");
            dataprofile.setProfession("update data profession si ID 1 disini");
            dataprofile.save();

Ok sekian dari tutorial cara menyimpan data di database android dengan menggunakan ORM Sugar.Happy coding!! have fun!!

PERHATIAN :


Jika kalian menemui beberapa pesan error, lakukan beberapa hal berikut :

no such table, cara mengatasinya (dari beberapa referensi yang saya baca) begini :
  1. disable instant run > tidak ngefek ke saya, tapi kalian silakan coba, siapa tau berhasil
  2. remove TAG meta-data utk DOMAIN_PACKAGE_NAME atau SEMUA tag meta-data di Manifest > tidak ngefek ke saya, tapi kalian silakan coba, siapa tau berhasil
  3. Invalidate caches dan Clean and Build project> tidak ngefek ke saya, tapi kalian boleh coba siapa tau berhasil
  4. Naikan VERSION databasenya di Manifest > cara ini berhasil ke saya, kenapa? karena saya beberapa kali memodifikasi Table nya (Dataprofile.java) tapi saya lupa menaikan VERSION databasenya
Can't downgrade database from x to x 
  1. Itu artinya kalian kelebihan dalam menaikan versi databasenya, silakan kurangi satu-demi satu
AddLikelySubtags
  1. Kalian lupa mengisi nama domain package nya dengan benar, silakan cek di meta-data AndroidManifest.xml

Referensi :
https://github.com/satyan/sugar
http://satyan.github.io/sugar/index.html
https://guides.codepath.com/android/Clean-Persistence-with-Sugar-ORM

Please post a polite comment and do not post a spam
EmoticonEmoticon