Sunday, June 18, 2017

Realm Example with Maps Picker
Bismillah
Pada kesempatan kali ini aku akan membuat aplikasi berbasis CRUD menggunakan database REALM, sebelum membuat projek kita harus tahu apa itu realm.

realm sendiri adalah jenis database yang secara langsung akan menyimpan data ke dalam storage device. Realm adalah pengganti sejenis database store mirip sqllite. Dari segi kecepatan dibanding database ORM lainnya realm lebih unggul.

Implementasi ke dalam project


  • LAYOUT
1. conten_main tambahkan ListView
<ListView    android:id="@+id/lv"    android:layout_width="match_parent"
android:layout_height="wrap_content"></ListView> 
2. buat layout xml baru dengan nama edit_mahasiswa, kemudian pada layoutnya tambahkan beberapa komponen EditText, dan Button 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="@color/colorPrimary">

    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="vertical"        android:padding="16dp">

        <TextView            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:fontFamily="sans-serif-condensed"            android:gravity="center"            android:text="TAMBAH MAHASISWA"            android:textColor="#fff" />

        <EditText            android:id="@+id/ednama"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_marginTop="5dp"            android:hint="Nama"            android:textColor="#fff"            android:textColorHint="#fff" />

        <EditText            android:id="@+id/edalamat"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_marginTop="2dp"            android:hint="Alamat"            android:textColor="#fff"            android:textColorHint="#fff" />

        <Button            android:id="@+id/btnEdit"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_marginTop="3dp"            android:text="Edit" />

        <Button            android:id="@+id/btnHapus"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_marginTop="3dp"            android:text="Hapus" />
    </LinearLayout>
</RelativeLayout>
4. Selanjutnya untuk layout insert_mahasiswa 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="@color/colorAccent"    android:orientation="vertical">

    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="vertical"        android:padding="16dp">

        <TextView            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:fontFamily="sans-serif-condensed"            android:gravity="center"            android:text="TAMBAH MAHASISWA"            android:textColor="#fff" />

        <EditText            android:id="@+id/txtnama"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_marginTop="5dp"            android:hint="Nama"            android:textColor="#fff"            android:textColorHint="#fff" />

        <EditText            android:id="@+id/txtalamat"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_marginTop="2dp"            android:hint="Alamat"            android:textColor="#fff"            android:textColorHint="#fff" />
        <Button            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:id="@+id/btnCari"            android:text="Cari Alamat"/>

        <Button            android:id="@+id/btnTambah"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_marginTop="3dp"            android:text="Tambah" />
    </LinearLayout>

</RelativeLayout>
5. Buat xml layout untuk membuat menampilkan isi dari lisview dengan cara menambahaan xml seperti berikut 
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">

    <TextView        android:id="@+id/txttnama"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="Aji" />

    <TextView        android:id="@+id/txttalamat"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="Kendal" />
</LinearLayout>

1. Buat sebuah project android studio, kemudin saat memilih activity pastikan untuk memilih basic activity, karena kita akan menggunakan fitur bawaan dari actvity tersesbut, yakni menggunakan floating acation button
2. Menambahkan dependency
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'    })
    compile 'com.android.support:appcompat-v7:24.2.1'    compile 'com.android.support:design:24.2.1'    //untuk library realm    compile 'io.realm:realm-android:0.87.2'    //untuk library maps    compile 'com.google.android.gms:play-services-maps:9.6.0'    compile 'com.google.android.gms:play-services:9.6.0'    compile 'com.android.support:support-v4:25.2.0'    testCompile 'junit:junit:4.12'
}
apply plugin: 'com.google.gms.google-services'

3.  Kemudian buat class BaseApp, untuk menbuat konfigurasi default dengan mengextend ke Application
package imastudio.realm;
/** * Created by Taufiq */public class MahasiswaModel {

    int idMahasiswa;
    String namaMahasiswa, alamatMahasiswa;

    public int getIdMahasiswa() {
        return idMahasiswa;
    }

    public void setIdMahasiswa(int idMahasiswa) {
        this.idMahasiswa = idMahasiswa;
    }

    public String getNamaMahasiswa() {
        return namaMahasiswa;
    }

    public void setNamaMahasiswa(String namaMahasiswa) {
        this.namaMahasiswa = namaMahasiswa;
    }

    public String getAlamatMahasiswa() {
        return alamatMahasiswa;
    }

    public void setAlamatMahasiswa(String alamatMahasiswa) {
        this.alamatMahasiswa = alamatMahasiswa;
    }

    /*konstruktor unutk berinteraksi dengan class ini    serta menambahkan data ke dalam class ini*/    public MahasiswaModel(int idMahasiswa, String namaMahasiswa, String alamatMahasiswa) {
        this.idMahasiswa = idMahasiswa;
        this.namaMahasiswa = namaMahasiswa;
        this.alamatMahasiswa = alamatMahasiswa;
    }
}
4. Pada manifest tambahkan
 <application    android:name=".BaseApp"    android:allowBackup="true"    android:icon="@mipmap/ic_launcher"    android:label="@string/app_name"    android:supportsRtl="true"
android:theme="@style/AppTheme"> 
5. Membuat kelas MahasiswaModel, fungsinya unutk melempar dan menagkan paramenter dari masing-masing data yang di store
public class MahasiswaModel {

    int idMahasiswa;
    String namaMahasiswa, alamatMahasiswa;

    public int getIdMahasiswa() {
        return idMahasiswa;
    }

    public void setIdMahasiswa(int idMahasiswa) {
        this.idMahasiswa = idMahasiswa;
    }

    public String getNamaMahasiswa() {
        return namaMahasiswa;
    }

    public void setNamaMahasiswa(String namaMahasiswa) {
        this.namaMahasiswa = namaMahasiswa;
    }

    public String getAlamatMahasiswa() {
        return alamatMahasiswa;
    }

    public void setAlamatMahasiswa(String alamatMahasiswa) {
        this.alamatMahasiswa = alamatMahasiswa;
    }

    /*konstruktor unutk berinteraksi dengan class ini    serta menambahkan data ke dalam class ini*/    public MahasiswaModel(int idMahasiswa, String namaMahasiswa, String alamatMahasiswa) {
        this.idMahasiswa = idMahasiswa;
        this.namaMahasiswa = namaMahasiswa;
        this.alamatMahasiswa = alamatMahasiswa;
    }
}
 6. Buat kelas mahasiswa
import io.realm.Realm;
import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
/** * Created by Taufiq */public class Mahasiswa extends RealmObject {

    @PrimaryKey    private int idMahasiswa;

    private String namaMahasiswa, alamatMahasiswa;

    public int getIdMahasiswa() {
        return idMahasiswa;
    }

    public void setIdMahasiswa(int idMahasiswa) {
        this.idMahasiswa = idMahasiswa;
    }

    public String getNamaMahasiswa() {
        return namaMahasiswa;
    }

    public void setNamaMahasiswa(String namaMahasiswa) {
        this.namaMahasiswa = namaMahasiswa;
    }

    public String getAlamatMahasiswa() {
        return alamatMahasiswa;
    }

    public void setAlamatMahasiswa(String alamatMahasiswa) {
        this.alamatMahasiswa = alamatMahasiswa;
    }
}
Disini menggunakan anotasi @PrimaryKey untuk mendeklarasikan id sebagai primary key.
@PrimaryKey
private int id;
Realm mendukung anotasi sebagai berikut :
@Required : Memberlakukan pemeriksaan untuk tidak membolehkan nilai null.
@Ignore : Kolom tidak harus disimpan.
@Index : Menambahkan index pencarian pada kolom.
@PrimaryKey : Identifikasi unik pada tiap data pada database. tetapi tidak menyediakan auto-increment 

7, Kemudian pada MainActivity tambahkan variable inisialaisasi
/*variable pada objek*/RealmHelper realmHelper;
ListView lv;
private ArrayList<MahasiswaModel> data;
private RealmHelper helper;

  •  inisialisasi pada oncreate 
realmHelper = new RealmHelper(MainActivity.this);
/*deklarasikan widaget listview*/lv = (ListView) findViewById(R.id.lv);
data = new ArrayList<>();
getData(); 


  •  kemudian pada floatingaction kita custom agar saat di klik dari floating action maka akan pindah halaman ke add mahasiswa
final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
    @Override    public void onClick(View view) {

        startActivity(new Intent(MainActivity.this,InasertMahasiswa.class));
    }
});

  •  full code dari MainActivity.java akan seperti ini 
package imastudio.realm;

import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;
import com.google.android.gms.ads.MobileAds;

import org.w3c.dom.Text;

import java.util.ArrayList;

import static imastudio.realm.R.id.fab;
import static imastudio.realm.R.id.txtalamat;
import static imastudio.realm.R.id.txtnama;

public class MainActivity extends AppCompatActivity {

    /*variable pada objek*/    RealmHelper realmHelper;
    ListView lv;
    private ArrayList<MahasiswaModel> data;
    private RealmHelper helper;

    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        Toast.makeText(MainActivity.this, String.valueOf(System.currentTimeMillis()), Toast.LENGTH_LONG).show();
        /*perkenalkan class RealmHelper pada class ini*/        realmHelper = new RealmHelper(MainActivity.this);
        /*deklarasikan widaget listview*/        lv = (ListView) findViewById(R.id.lv);
        data = new ArrayList<>();

       
        /*menmpilkan data saat activity muncul*/        getData();

        /*event pada FAB*/        final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override            public void onClick(View view) {

                startActivity(new Intent(MainActivity.this,InasertMahasiswa.class));
            }
        });

        lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override            public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
                return false;
            }
        });

        /*event ketika listview diklik*/        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override            public void onItemClick(AdapterView<?> adapterView, View view, final int i, long l) {

                /*model mahasiswa diambil dengan variable d sesuai posisi*/                final MahasiswaModel d = data.get(i);

                /*menampilkan dialog*/                /*perkenalkan diaog ke dalam actiity ini*/                final Dialog dialog = new Dialog(MainActivity.this);
                dialog.setContentView(R.layout.edit_mahasiswa);

                /*deskripsikan widget*/                final EditText edalamat = (EditText) dialog.findViewById(R.id.edalamat);
                final EditText ednama = (EditText) dialog.findViewById(R.id.ednama);
                Button btntambah = (Button) dialog.findViewById(R.id.btnEdit);
                Button btnhapus = (Button) dialog.findViewById(R.id.btnHapus);

                /*menampilkan data ke dalam EditText*/                ednama.setText(d.getNamaMahasiswa());
                edalamat.setText(d.getAlamatMahasiswa());

                /*event pada tombol hapus*/                btnhapus.setOnClickListener(new View.OnClickListener() {
                    @Override                    public void onClick(View view) {
                        realmHelper.deleteData(d.idMahasiswa);
                        dialog.dismiss();
                        getData();
                    }
                });

                /*event pada tombol edit*/                btntambah.setOnClickListener(new View.OnClickListener() {
                    @Override                    public void onClick(View view) {
                        String nama = ednama.getText().toString();
                        String alamat = edalamat.getText().toString();
                        realmHelper.updateData(d.idMahasiswa, nama, alamat);
                        dialog.dismiss();
                        getData();
                    }
                });

                dialog.show();
            }
        });
    }


    /*method mengambil data*/    private void getData() {
        try {
            data = realmHelper.findAll();
        } catch (Exception e) {

        }

        /*memasukan data ke dalam ListVuiew*/        try {
            CustomAdapter adapter = new CustomAdapter(this, data);
            lv.setAdapter(adapter);
        } catch (NullPointerException e) {

        }
    }

    @Override    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will        // automatically handle clicks on the Home/Up button, so long        // as you specify a parent activity in AndroidManifest.xml.        int id = item.getItemId();

        //noinspection SimplifiableIfStatement        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override    protected void onRestart() {
        super.onRestart();
        getData();
    }
}


  • Kemudain pada InsertMahasiswa.xml tambahkan kode berikut . silahkan di lihat di pada komentar kode untuk mengtahui fungsinya. disini kita juga menambahkan sebuah maps utnuk mengambil lokasinya .

package imastudio.realm;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import com.google.android.gms.common.GooglePlayServicesRepairableException;
import com.google.android.gms.location.places.Place;
import com.google.android.gms.location.places.ui.PlacePicker;

/** * Created by Taufiq on 5/29/2017. */
public class InasertMahasiswa extends AppCompatActivity {
    
    
    RealmHelper realmHelper;
    private static final int PLACE_PICKER_REQUEST =101 ;
    EditText edNama,edAlamat;
    Button btAlamat, btInput;

    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.insert_mahasiswa);

        realmHelper = new RealmHelper(InasertMahasiswa.this);
        setView();
        btAlamat.setOnClickListener(new View.OnClickListener() {
            @Override            public void onClick(View v) {
                // membuat Intent untuk Place Picker                // membuat Intent untuk Place Picker                PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder();
                try {
                    //menjalankan place picker                    startActivityForResult(builder.build(InasertMahasiswa.this), PLACE_PICKER_REQUEST);


                } catch (GooglePlayServicesRepairableException e) {
                    e.printStackTrace();
                } catch (GooglePlayServicesNotAvailableException e) {
                    e.printStackTrace();
                }
            }

        });
        btInput.setOnClickListener(new View.OnClickListener() {
            @Override            public void onClick(View v) {
                /*simpan data dengan memenggil method addMahasiswa*/                String nama = edNama.getText().toString();
                String alamat = edAlamat.getText().toString();
                realmHelper.addMahasiswa(nama, alamat);
                Intent a = new Intent(InasertMahasiswa.this,MainActivity.class);

                startActivity(a);


            }
        });
    }

    private void setView() {
        edAlamat =(EditText)findViewById(R.id.txtalamat);
        edNama =(EditText)findViewById(R.id.txtnama);
        btAlamat =(Button)findViewById(R.id.btnCari);
        btInput =(Button)findViewById(R.id.btnTambah);
    }
    
    // code untuk membuat maps picker    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // menangkap hasil balikan dari Place Picker, dan menampilkannya pada TextView        if (requestCode == PLACE_PICKER_REQUEST) {
            if (resultCode == RESULT_OK) {
                Place place = PlacePicker.getPlace(data, this);
                String toastMsg = String.format(
                        "Place: %s \n" +
                                "Alamat: %s \n" +
                                "Latlng %s \n", place.getName(), place.getAddress(), place.getLatLng().latitude + " " + place.getLatLng().longitude);
                edAlamat.setText(toastMsg);

            }
        }
    }

}

Oke saya kira cukup sekian ..
untuk source codenya nya bagi mau bisa request ke Email saya
taufiqhidayaht@gmail.com