You are on page 1of 31

Cara Membuat CRUD SQLite Database Android Studio

Published by farizdotid on February 19, 2019, https://farizdotid.com/crud-sqlite-android-studio/

Cara Membuat CRUD SQLite Database Android Studio

Pada tutorial pemrograman android ini, untuk membuat databasenya kita akan menggunakan


bantuan library Greendao. Library Greendao ini adalah library buatan dari GreenRobot, Nah
daripada bingung saya akan mengkutip istilah Greendao ini itu apa. Menurut situs
resminya : greenDAO is an open source Android ORM making development for SQLite databases fun
again. It relieves developers from dealing with low-level database requirements while saving
development time. SQLite is an awesome embedded relational database. Still, writing SQL and
parsing query results are quite tedious and time-consuming tasks. greenDAO frees you from these by
mapping Java objects to database tables (called ORM, “object/relational mapping”). This way you
can store, update, delete, and query for Java objects using a simple object oriented API.

Ada apa aja fitur dari Greendao ini ?

 Maximum performance (probably the fastest ORM for Android); our benchmarks are open
sourced too

 Easy to use powerful APIs covering relations and joins

 Minimal memory consumption

 Small library size (<100KB) to keep your build times low and to avoid the 65k method limit

 Database encryption: greenDAO supports SQLCipher to keep your user’s data safe

 Strong community: More than 5.000 GitHub stars show there is a strong and active
community

Kalian bisa mengunjungi situs resminya di http://greenrobot.org/greendao/

Nah, Dari sini kalian sudah tau maksud dari tujuan artikel Cara Membuat CRUD SQLite Database
Android Studio ini itu apa. Sekarang kita masuk ke bagaimana cara implementasi CRUD SQLite
Database, lets coding!
Persiapan nama project

Buat project dengan nama SampleCrudGreendao.

Tambahkan library Greendao dan library pendukung lainnya

Buka file build.gradle ( module:app ) lalu tambahkan beberapa code seperti berikut :

1 apply plugin: 'com.android.application'

2 apply plugin: 'org.greenrobot.greendao' // <-- Add this line

3  

4 android {

5     compileSdkVersion 28

6     defaultConfig {

7         applicationId "com.app.samplecrudgreendao"

8         minSdkVersion 21

9         targetSdkVersion 28

10         versionCode 1

11         versionName "1.0"

12         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

13     }

14     buildTypes {

15         release {

16             minifyEnabled false

17             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-


rules.pro'
18
        }
19
    }
20
}
21
 
22
dependencies {
23
    implementation fileTree(dir: 'libs', include: ['*.jar'])
24
    implementation 'com.android.support:appcompat-v7:28.0.0'
25
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
26     implementation 'com.android.support:design:28.0.0' // <-- Add this line

27     implementation 'com.android.support:cardview-v7:28.0.0' // <-- Add this line

28     implementation 'com.android.support:recyclerview-v7:28.0.0' // <-- Add this line

29  

30     implementation 'com.jakewharton:butterknife:8.8.0' // <-- Add this line

31  

32     implementation 'org.greenrobot:greendao:3.2.2' // <-- Add this line

33  

34     annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.0' // <-- Add this line

35  

36     testImplementation 'junit:junit:4.12'

37     androidTestImplementation 'com.android.support.test:runner:1.0.2'

38     androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

39 }

40  

41 greendao { // <-- Add this line

42     schemaVersion 1 // <-- Add this line

43 } // <-- Add this line

#NOTE :

Untuk penambahan kodenya kalian hanya cukup meng-copy paste / mengetik yang ada tanda “Add
this line”nya saja.

Library Greendao pada root gradle

Buka file build.gradle (Project : SampleCrudGreendao) lalu tambahkan kode seperti berikut :

1 // Top-level build file where you can add configuration options common to all sub-
projects/modules.
2
 
3
buildscript {
4
    repositories {
5
        google()
6
        jcenter()
7
        mavenCentral()
8
    }
9
    dependencies {
10
        classpath 'com.android.tools.build:gradle:3.3.1'
11
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // <-- Add this line
12
        // NOTE: Do not place your application dependencies here; they belong
13
        // in the individual module build.gradle files
14
    }
15
}
16
 
17
allprojects {
18
    repositories {
19
        google()
20
        jcenter()
21
        
22
    }
23
}
24
 
25
task clean(type: Delete) {
26
    delete rootProject.buildDir
27
}

Sync Project

Jika semua sudah tercopy – paste kalian bisa langsung mengklik action button “Sync Now” agar
proses pengambilan library segera diproses.

Persiapan struktur folder

Buatlah sebuah package folder dengan nama – nama folder sebagai berikut :

-create

-edit

-home

-utils

–database
Cara Membuat CRUD SQLite Database Android Studio-1

Buat class TblPengeluaran

Didalem folder database tambahkan class baru dengan nama TblPengeluaran. Lalu isi dengan kode
berikut :

1 @Entity

2 public class TblPengeluaran {

4     @Id(autoincrement = true)

5     private Long idTblPengeluaran;

7     private String pengeluaran;

8     private int nominal;

9}

#NOTE :

Anotasi @Entitiy ini adalah untuk kasih tau ke generatornya si Greendao bahwa class ini adalah
untuk menjadi struktur tabelnya. Lalu untuk @Id(autoincrement = true) ini adalah kasih tau ke
generator bahwa idTblPengeluaran ini bentuknya unik atau bertambah setiap saat. Jadi kurang lebih
maksud class ini untuk membuat struktur tabel pada databasenya.

Build Generator

Jika kalian sudah membuat class untuk pengaturan tabelnya, Sekarang kamu klik icon palu ( build )
lalu tungu beberapa saat. Fungsi itu untuk menjalankan generator Greendaonya.

Nanti secara otomatis Greendao akan membuat class untuk kebutuhan development kita. Hasil kode
yang kita build adalah sebagai berikut :

1 package com.app.samplecrudgreendao.utils.database;
2  

3 import org.greenrobot.greendao.annotation.Entity;

4 import org.greenrobot.greendao.annotation.Id;

5 import org.greenrobot.greendao.annotation.Generated;

6  

7 /**

8 * Created by Fariz Ramadhan.

9 * website : https://farizdotid.com/

10 * github : https://github.com/farizdotid

11 * linkedin : https://www.linkedin.com/in/farizramadhan/

12 */

13 @Entity

14 public class TblPengeluaran {

15  

16     @Id(autoincrement = true)

17     private Long idTblPengeluaran;

18  

19     private String pengeluaran;

20     private int nominal;

21     @Generated(hash = 388400954)

22     public TblPengeluaran(Long idTblPengeluaran, String pengeluaran, int nominal) {

23         this.idTblPengeluaran = idTblPengeluaran;

24         this.pengeluaran = pengeluaran;

25         this.nominal = nominal;

26     }

27     @Generated(hash = 177408923)

28     public TblPengeluaran() {

29     }

30     public Long getIdTblPengeluaran() {

31         return this.idTblPengeluaran;
32     }

33     public void setIdTblPengeluaran(Long idTblPengeluaran) {

34         this.idTblPengeluaran = idTblPengeluaran;

35     }

36     public String getPengeluaran() {

37         return this.pengeluaran;

38     }

39     public void setPengeluaran(String pengeluaran) {

40         this.pengeluaran = pengeluaran;

41     }

42     public int getNominal() {

43         return this.nominal;

44     }

45     public void setNominal(int nominal) {

46         this.nominal = nominal;

47     }

48 }

Buat class DaoHandler

Tambahkan class baru dengan nama DaoHandler lalu tambahkan fungsi static untuk memanggil
DaoSession. Untuk kodenya seperti berikut :

public class DaoHandler {


1
    public static DaoSession getInstance(Context context) {
2
        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context,
3
"catatpengeluaran_db", null);
4
        SQLiteDatabase db = helper.getWritableDatabase();
5
 
6
        DaoMaster daoMaster = new DaoMaster(db);
7
        return daoMaster.newSession();
8
    }
9
}

#NOTE :
Pada value “catatpengeluaran_db” ini adalah nama databasenya. Class ini berfunsi untuk kebutuhan
inisialisasi pengaturan Greendao, Nantinya kalian hanya tinggal panggil kode ini saja untuk
memanggil fungsi Greendao seperti get tabel pada database ataupun kebutuhan-kebutuhan SQLite
lainnya.

Buat class FunctionHelper

Pada package utils, tambahkan class baru dengan nama FunctionHelper. Class ini berfungsi untuk
menyompan beberapa fungsi yang dibutuhkan nantinya supaya fungsi yang dibuat tidak berulang-
ulang.

Menambahkan fungsi

Pada class FunctionHelper buatlah sebuah fungsi untuk meng-convert suatu nilai ke dalam format
uang rupiah. Untuk kodenya seperti ini :

1 /*

2 Fungsi untuk mengconvert sebuah nilai menjadi format Rupiah.

3 Contoh : 1000 akan menjadi Rp1.000

4 */

5 public static String convertRupiah(int nominal){

6     Locale localeID = new Locale("in", "ID");

7     NumberFormat formatRupiah = NumberFormat.getCurrencyInstance(localeID);

8     return formatRupiah.format(nominal);

9}

Buat activity CreateActivity

Pada folder atau package create tambahkan activity baru dengan nama CreateActivity.
CreateActivity ini untuk membuat data sesuai dengan kebutuhan user.

Layout activity create

Buka layout activity_create, Lalu isi dengan beberapa widget seperti ini :

1 <?xml version="1.0" encoding="utf-8"?>

2 <LinearLayout

3     xmlns:android="http://schemas.android.com/apk/res/android"

4     xmlns:app="http://schemas.android.com/apk/res-auto"

5     xmlns:tools="http://schemas.android.com/tools"

6     android:layout_width="match_parent"
7     android:layout_height="match_parent"

8     android:padding="16dp"

9     android:orientation="vertical"

10     tools:context=".create.CreateActivity">

11  

12     <android.support.design.widget.TextInputLayout

13         android:layout_width="match_parent"

14         android:layout_height="wrap_content"

15         android:hint="@string/title_pembelian">

16  

17         <EditText

18             android:id="@+id/etPembelian"

19             android:layout_width="match_parent"

20             android:layout_height="wrap_content"

21             android:inputType="textMultiLine"

22             android:textSize="16sp"

23             android:textColor="@color/primary_text"

24             android:fontFamily="@font/notosans_regular"/>

25     </android.support.design.widget.TextInputLayout>

26  

27     <android.support.design.widget.TextInputLayout

28         android:layout_width="match_parent"

29         android:layout_height="wrap_content"

30         android:layout_marginTop="16dp"

31         android:hint="@string/title_nominal">

32  

33         <EditText

34             android:id="@+id/etNominal"

35             android:layout_width="match_parent"

36             android:layout_height="wrap_content"
37             android:inputType="number"

38             android:textSize="16sp"

39             android:textColor="@color/primary_text"

40             android:fontFamily="@font/notosans_regular" />

41     </android.support.design.widget.TextInputLayout>

42  

43     <Button

44         android:id="@+id/btnSimpan"

45         android:layout_width="match_parent"

46         android:layout_height="wrap_content"

47         android:fontFamily="@font/notosans_bold"

48         android:layout_marginTop="16dp"

49         android:text="@string/title_simpan"

50         android:textSize="14sp"

51         android:textColor="@android:color/white"

52         android:background="@color/colorPrimaryDark"/>

53 </LinearLayout>

Inisialisasi Komponen

Pada class CreateActivity lalu inisialisasikan komponen widget yang sudah kita buat pada layout
activity_create dan inisialisasi beberapa class untuk kebutuhan Create ini.

1 @BindView(R.id.etPembelian)

2 EditText etPembelian;

3 @BindView(R.id.etNominal)

4 EditText etNominal;

5 @BindView(R.id.btnSimpan)

6 Button btnSimpan;

8 private Unbinder unbinder;

9 private DaoSession daoSession;

Lalu didalam onCreate tambahkan kode berikut :


1 Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);

2         getSupportActionBar().setDisplayShowHomeEnabled(true);

3         getSupportActionBar().setTitle("Buat pengeluaran");

4  

5         unbinder = ButterKnife.bind(this);

6         daoSession = DaoHandler.getInstance(this);

7  

8         btnSimpan.setOnClickListener(new View.OnClickListener() {

9             @Override

10             public void onClick(View v) {

11                 String pembelian = etPembelian.getText().toString();

12                 String nominal = etNominal.getText().toString();

13  

14                 if (pembelian.isEmpty() || nominal.isEmpty()){

15                     Toast.makeText(CreateActivity.this, "Data tidak boleh kosong",


Toast.LENGTH_SHORT).show();
16
                } else {
17
                    TblPengeluaran tblPengeluaran = new TblPengeluaran();
18
                    tblPengeluaran.setPengeluaran(pembelian);
19
                    tblPengeluaran.setNominal(Integer.parseInt(nominal));
20
                    daoSession.getTblPengeluaranDao().insert(tblPengeluaran);
21
 
22
                    Toast.makeText(CreateActivity.this, "Berhasil menginput data",
23
                            Toast.LENGTH_SHORT).show();
24
                    startActivity(new Intent(CreateActivity.this, HomeActivity.class)
25
                            .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
26
Intent.FLAG_ACTIVITY_CLEAR_TOP));
27
                    finish();
28
                }
29
            }
        });

Untuk full source code pada CreateActivity sebagai berikut :

1 public class CreateActivity extends AppCompatActivity {

2  

3     @BindView(R.id.etPembelian)

4     EditText etPembelian;

5     @BindView(R.id.etNominal)

6     EditText etNominal;

7     @BindView(R.id.btnSimpan)

8     Button btnSimpan;

9  

10     private Unbinder unbinder;

11     private DaoSession daoSession;

12  

13     @Override

14     protected void onCreate(Bundle savedInstanceState) {

15         super.onCreate(savedInstanceState);

16         setContentView(R.layout.activity_create);

17  

18         Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);

19         getSupportActionBar().setDisplayShowHomeEnabled(true);

20         getSupportActionBar().setTitle("Buat pengeluaran");

21  

22         unbinder = ButterKnife.bind(this);

23         daoSession = DaoHandler.getInstance(this);

24  

25         btnSimpan.setOnClickListener(new View.OnClickListener() {

26             @Override

27             public void onClick(View v) {


28                 String pembelian = etPembelian.getText().toString();

29                 String nominal = etNominal.getText().toString();

30  

31                 if (pembelian.isEmpty() || nominal.isEmpty()){

32                     Toast.makeText(CreateActivity.this, "Data tidak boleh kosong",


Toast.LENGTH_SHORT).show();
33
                } else {
34
                    /*
35
                    Fungsi untuk menambahkan data kedalam database. Disini kita menambahkan data
36
                    kedalam tabel TblPengeluaran.
37
                    Di Greendao jika mau menambakan data fungsi yang kita panggil adalah insert.
38
                     */
39
                    TblPengeluaran tblPengeluaran = new TblPengeluaran();
40
                    tblPengeluaran.setPengeluaran(pembelian);
41
                    tblPengeluaran.setNominal(Integer.parseInt(nominal));
42
                    daoSession.getTblPengeluaranDao().insert(tblPengeluaran);
43
 
44
                    Toast.makeText(CreateActivity.this, "Berhasil menginput data",
45
                            Toast.LENGTH_SHORT).show();
46
                    startActivity(new Intent(CreateActivity.this, HomeActivity.class)
47
                            .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
48
Intent.FLAG_ACTIVITY_CLEAR_TOP));
49
                    finish();
50
                }
51
            }
52
        });
53
    }
54
 
55
    @Override
56
    public boolean onSupportNavigateUp() {
57
        onBackPressed();
        return true;
58
    }
59
 
60
    @Override
61
    protected void onDestroy() {
62
        super.onDestroy();
63
        unbinder.unbind();
64
    }
65
}

Buat fragment EditDialogFragment

Pada package edit buatlah sebuah dialog fragment dengan nama EditDialogFragment. Lalu isi dengan
kode berikut :

1 public class EditDialogFragment extends DialogFragment {

2  

3     @BindView(R.id.etPembelian)

4     EditText etPembelian;

5     @BindView(R.id.etNominal)

6     EditText etNominal;

7     @BindView(R.id.btnSimpan)

8     Button btnSimpan;

9  

10     private Unbinder unbinder;

11     private EditDialogListener editDialogListener;

12  

13     private static final String ARGS_ID = "args_id";

14     private static final String ARGS_PEMBELIAN = "args_pembelian";

15     private static final String ARGS_NOMINAL = "args_nominal";

16  

17     private long mId;

18     private String mPembelian;


19     private int mNominal;

20  

21     public EditDialogFragment() {

22     }

23  

24     @Override

25     public void onAttach(Context context) {

26         super.onAttach(context);

27         editDialogListener = (EditDialogListener) context;

28     }

29  

30     public static EditDialogFragment newInstance(long id, String pembelian, int nominal) {

31         EditDialogFragment editDialogFragment = new EditDialogFragment();

32         Bundle args = new Bundle();

33         args.putLong(ARGS_ID, id);

34         args.putString(ARGS_PEMBELIAN, pembelian);

35         args.putInt(ARGS_NOMINAL, nominal);

36         editDialogFragment.setArguments(args);

37         return editDialogFragment;

38     }

39  

40     @Override

41     public void onCreate(@Nullable Bundle savedInstanceState) {

42         super.onCreate(savedInstanceState);

43         setStyle(DialogFragment.STYLE_NORMAL, R.style.Theme_AppCompat_Light_Dialog_Alert);

44  

45         if (getArguments() != null){

46             mId = getArguments().getLong(ARGS_ID);

47             mPembelian = getArguments().getString(ARGS_PEMBELIAN);

48             mNominal = getArguments().getInt(ARGS_NOMINAL);
49         }

50     }

51  

52     @Nullable

53     @Override

54     public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup


container, @Nullable Bundle savedInstanceState) {
55
        View view = inflater.inflate(R.layout.fragment_dialog_edit, container);
56
        unbinder = ButterKnife.bind(this, view);
57
        return view;
58
    }
59
 
60
    @Override
61
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
62
        super.onViewCreated(view, savedInstanceState);
63
 
64
        etPembelian.setText(mPembelian);
65
        etNominal.setText(String.valueOf(mNominal));
66
 
67
        btnSimpan.setOnClickListener(new View.OnClickListener() {
68
            @Override
69
            public void onClick(View v) {
70
                String pembelian = etPembelian.getText().toString();
71
                String nominal = etNominal.getText().toString();
72
 
73
                /*
74
                Fungsi ini iuntuk mengirim data berupa id, pembelian, dan nominal ke
75
                activity/fragment yang di implementasinya.
76
                 */
77
                editDialogListener.requestUpdate(mId, pembelian, Integer.parseInt(nominal));
78
                getDialog().dismiss();
            }
79         });

80     }

81  

82     @Override

83     public void onDestroyView() {

84         super.onDestroyView();

85         unbinder.unbind();

86     }

87  

88     /*

89     Interface EditDialogListener ini untuk digunakan dalam class yang kita implement nantinya.

90     EditDialogListener ini berisi fungsi requestUpdate dengan parameter id, pembelian, nominal.

91     Nah nantinya data yang ada di EditDialogFragment ini kita akan parsing ke activity/frgament
yang
92
    diimplementnya.
93
 
94
    Sebagai contoh : Dari edit dialog ini user meng-inputkan pembelian "Baju Supreme" dan
95
nominalnya
96
    "5000", maka si activity/fragment implementnya akan menerima data tersebut. Data
97 tersebut nanti

98     kita akan olah sesuai dengan kebtuuhan.

99      */

100     public interface EditDialogListener {

101         void requestUpdate(long id, String pembelian, int nominal);

102     }
}

Buat class adapter pengeluaran

Pada package home buatlah sebuah class adapter dengan nama PengeluaranAdapter. Untuk
kodenya seperti ini :

1 public class PengeluaranAdapter extends


2         RecyclerView.Adapter<PengeluaranAdapter.ViewHolder> {

3  

4     private static final String TAG = PengeluaranAdapter.class.getSimpleName();

5  

6     private List<TblPengeluaran> list;

7     private PengeluaranAdapterCallback mAdapterCallback;

8  

9     public PengeluaranAdapter(List<TblPengeluaran> list, PengeluaranAdapterCallback


adapterCallback) {
10
        this.list = list;
11
        this.mAdapterCallback = adapterCallback;
12
    }
13
 
14
    @Override
15
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
16
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_pengeluaran,
17
                parent, false);
18
        return new ViewHolder(view);
19
    }
20
 
21
    @Override
22
    public void onBindViewHolder(ViewHolder holder, int position) {
23
        TblPengeluaran item = list.get(position);
24
 
25
        String pengeluaran = item.getPengeluaran();
26
        int nominal = item.getNominal();
27
 
28
        holder.tvPengeluaran.setText(pengeluaran);
29
 
30
        Locale localeID = new Locale("in", "ID");
31
        NumberFormat formatRupiah = NumberFormat.getCurrencyInstance(localeID);
32         holder.tvNominal.setText(formatRupiah.format(nominal));

33     }

34  

35     @Override

36     public int getItemCount() {

37         return list.size();

38     }

39  

40     public void clear() {

41         int size = this.list.size();

42         this.list.clear();

43         notifyItemRangeRemoved(0, size);

44     }

45  

46     public class ViewHolder extends RecyclerView.ViewHolder {

47  

48         @BindView(R.id.tvPengeluaran)

49         TextView tvPengeluaran;

50         @BindView(R.id.tvNominal)

51         TextView tvNominal;

52         @BindView(R.id.ivDelete)

53         ImageView ivDelete;

54  

55         public ViewHolder(View itemView) {

56             super(itemView);

57             ButterKnife.bind(this, itemView);

58  

59             ivDelete.setOnClickListener(new View.OnClickListener() {

60                 @Override

61                 public void onClick(View v) {


62                     mAdapterCallback.onDelete(getAdapterPosition());

63                 }

64             });

65  

66             itemView.setOnLongClickListener(new View.OnLongClickListener() {

67                 @Override

68                 public boolean onLongClick(View v) {

69                     mAdapterCallback.onLongClick(getAdapterPosition());

70                     return true;

71                 }

72             });

73         }

74     }

75  

76     public interface PengeluaranAdapterCallback {

77         void onLongClick(int position);

78         void onDelete(int position);

79     }

80 }

Jika masih ada error pada bagian layout dan beberapa komponen widgetnya itu karena kita belum
membuat file layout untuk kebutuhan adapternya. Buatlah sebuah layout baru dengan nama
item_pengeluaran lalu isi dengan kode berikut :

1 <?xml version="1.0" encoding="utf-8"?>

2 <android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
3
    android:layout_width="match_parent"
4
    android:layout_height="wrap_content"
5
    xmlns:app="http://schemas.android.com/apk/res-auto"
6
    xmlns:tools="http://schemas.android.com/tools"
7
    app:contentPadding="8dp"
8
    app:cardCornerRadius="4dp"
9     android:layout_marginBottom="8dp"

10     android:elevation="4dp">

11  

12     <RelativeLayout

13         android:layout_width="match_parent"

14         android:layout_height="wrap_content">

15  

16         <TextView

17             android:id="@+id/tvPengeluaran"

18             android:layout_width="match_parent"

19             android:layout_height="wrap_content"

20             android:layout_toStartOf="@+id/tvNominal"

21             android:layout_marginEnd="16dp"

22             tools:text="@string/title_pengeluaran"

23             android:textSize="16sp"

24             android:fontFamily="@font/notosans_regular"

25             android:layout_centerVertical="true"

26             android:textColor="@color/secondary_text"/>

27  

28         <TextView

29             android:id="@+id/tvNominal"

30             android:layout_width="wrap_content"

31             android:layout_height="wrap_content"

32             android:layout_alignParentEnd="true"

33             android:layout_marginTop="8dp"

34             android:layout_below="@id/tvPengeluaran"

35             tools:text="Rp.500.000,0"

36             android:textSize="16sp"

37             android:fontFamily="@font/notosans_bold"

38             android:layout_gravity="start|center_vertical"
39             android:textColor="@color/colorPrimaryDark"/>

40  

41         <ImageView

42             android:id="@+id/ivDelete"

43             android:layout_width="wrap_content"

44             android:layout_height="wrap_content"

45             app:srcCompat="@drawable/ic_delete_forever"

46             android:layout_alignParentEnd="true"

47             android:tint="@android:color/darker_gray"

48             tools:ignore="ContentDescription" />

49     </RelativeLayout>

50  

51 </android.support.v7.widget.CardView>

Layout activity main

Pada layout activity_main isi dengan widget berikut :

1 <?xml version="1.0" encoding="utf-8"?>

2 <android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
3
    xmlns:app="http://schemas.android.com/apk/res-auto"
4
    xmlns:tools="http://schemas.android.com/tools"
5
    android:layout_width="match_parent"
6
    android:layout_height="match_parent"
7
    tools:context=".home.HomeActivity">
8
 
9
    <android.support.design.widget.AppBarLayout
10
        android:layout_width="match_parent"
11
        android:layout_height="wrap_content"
12
        android:theme="@style/AppTheme.AppBarOverlay">
13
 
14
        <android.support.v7.widget.Toolbar
15             android:id="@+id/toolbar"

16             android:layout_width="match_parent"

17             android:layout_height="?attr/actionBarSize"

18             android:background="?attr/colorPrimary"

19             app:popupTheme="@style/AppTheme.PopupOverlay" />

20  

21     </android.support.design.widget.AppBarLayout>

22  

23     <include layout="@layout/content_main" />

24  

25     <android.support.design.widget.FloatingActionButton

26         android:id="@+id/fabAdd"

27         android:layout_width="wrap_content"

28         android:layout_height="wrap_content"

29         android:layout_gravity="bottom|end"

30         android:layout_margin="@dimen/fab_margin"

31         app:srcCompat="@drawable/ic_add" />

32  

33 </android.support.design.widget.CoordinatorLayout>

Persiapan home activity

Pada class HomeActivity isi dengan kode berikut :

1 public class HomeActivity extends AppCompatActivity

2         implements PengeluaranAdapter.PengeluaranAdapterCallback,

3         EditDialogFragment.EditDialogListener {

4  

5     @BindView(R.id.toolbar)

6     Toolbar toolbar;

7     @BindView(R.id.rvNote)

8     RecyclerView rvNote;
9     @BindView(R.id.fabAdd)

10     FloatingActionButton fabAdd;

11     @BindView(R.id.tvTotal)

12     TextView tvTotal;

13  

14     private DaoSession daoSession;

15     private PengeluaranAdapter pengeluaranAdapter;

16  

17     private List<TblPengeluaran> tblPengeluaranList;

18  

19     @Override

20     protected void onCreate(Bundle savedInstanceState) {

21         super.onCreate(savedInstanceState);

22         setContentView(R.layout.activity_main);

23  

24         ButterKnife.bind(this);

25         daoSession = DaoHandler.getInstance(this);

26         setSupportActionBar(toolbar);

27  

28         /*

29         Fungi untuk READ data dari database. Contoh disini memanggil data yang berada dalam

30         tabel TblPengeluaran.

31          */

32         tblPengeluaranList = daoSession.getTblPengeluaranDao().queryBuilder().list();

33         pengeluaranAdapter = new PengeluaranAdapter(tblPengeluaranList, this);

34         rvNote.setLayoutManager(new LinearLayoutManager(this));

35         rvNote.setItemAnimator(new DefaultItemAnimator());

36         rvNote.setAdapter(pengeluaranAdapter);

37         pengeluaranAdapter.notifyDataSetChanged();

38  
39         tvTotal.setText(FunctionHelper.convertRupiah(getTotal()));

40  

41         fabAdd.setOnClickListener(new View.OnClickListener() {

42             @Override

43             public void onClick(View view) {

44                 startActivity(new Intent(HomeActivity.this, CreateActivity.class));

45             }

46         });

47     }

48  

49     /*

50     Fungsi untuk mengirim data dari adapter ke edit dialog.

51     Disini memanggil EditDialogFragment dengan parameter id, pembelian, dan nominal.

52      */

53     @Override

54     public void onLongClick(int position) {

55         long id = tblPengeluaranList.get(position).getIdTblPengeluaran();

56         String pembelian = tblPengeluaranList.get(position).getPengeluaran();

57         int nominal = tblPengeluaranList.get(position).getNominal();

58  

59         FragmentManager fm = getSupportFragmentManager();

60         EditDialogFragment editDialogFragment = EditDialogFragment.newInstance(id, pembelian,


nominal);
61
        editDialogFragment.show(fm, "dialog_edit");
62
    }
63
 
64
    /*
65
    Fungsi delete data. Sebelum menghapus data ada semacam popup terlebih dahulu agar
66
meyakinkan user.
67
     */
68
    @Override
69     public void onDelete(int position) {

70         String name = tblPengeluaranList.get(position).getPengeluaran();

71         showDialogDelete(position, name);

72     }

73  

74     /*

75     Fungsi untuk men-totalkan semua nominal yang ada didalam tabel TblPengeluaran.

76      */

77     private int getTotal(){

78         int total = 0;

79         for (int i = 0; i < tblPengeluaranList.size(); i++){

80             int nominal = tblPengeluaranList.get(i).getNominal();

81             total = total + nominal;

82         }

83         return total;

84     }

85  

86     /*

87     Fungsi untuk memanggil Alert Dialog. Alert dialog ini berfungsi untuk meyakinkan user
kembali
88
    apakah datanya ingin dihapus atau tidak.
89
     */
90
    private void showDialogDelete(final int position, String name){
91
        AlertDialog.Builder builder1 = new AlertDialog.Builder(HomeActivity.this);
92
        builder1.setMessage("Yakin untuk menghapus item "+ name + " ?");
93
        builder1.setCancelable(true);
94
 
95
        builder1.setPositiveButton(
96
                "Ya",
97
                new DialogInterface.OnClickListener() {
98
                    public void onClick(DialogInterface dialog, int id) {
99                         /*

100                         Fungsi delete suatu data bedasarkan idnya.

101                          */

102                         long idTbl = tblPengeluaranList.get(position).getIdTblPengeluaran();

103                         daoSession.getTblPengeluaranDao().deleteByKey(idTbl);

104  

105                         tblPengeluaranList.remove(position);

106                         pengeluaranAdapter.notifyItemRemoved(position);

107                         pengeluaranAdapter.notifyItemRangeChanged(position, tblPengeluaranList.size());

108  

109                         tvTotal.setText(FunctionHelper.convertRupiah(getTotal()));

110  

111                         dialog.dismiss();

112                     }

113                 });

114  

115         builder1.setNegativeButton(

116                 "Tidak",

117                 new DialogInterface.OnClickListener() {

118                     public void onClick(DialogInterface dialog, int id) {

119                         dialog.cancel();

120                     }

121                 });

122  

123         AlertDialog alert11 = builder1.create();

124         alert11.show();

125     }

126  

127     /*

128     Fungsi ini untuk menerima data yang dikirimkan dari EditDialogFragment ke HomeActivity.
    Data yang dikirimkan dari EditDialogFragment ini ada id, pembelian, dan nominal. Lalu
129
    setelah mendapatkan datanya panggil fungsi update dari Greendao.
130
     */
131
    @Override
132
    public void requestUpdate(long id, String pembelian, int nominal) {
133
        TblPengeluaran tblPengeluaran = daoSession.getTblPengeluaranDao().load(id);
134
        tblPengeluaran.setPengeluaran(pembelian);
135
        tblPengeluaran.setNominal(nominal);
136
        daoSession.getTblPengeluaranDao().update(tblPengeluaran);
137
 
138
        pengeluaranAdapter.notifyDataSetChanged();
139
        tvTotal.setText(FunctionHelper.convertRupiah(getTotal()));
140
    }
141
}

Run application

Silahkan jalankan aplikasi.

Screenshot Aplikasi
   
   
 

You might also like