Professional Documents
Culture Documents
Maximum performance (probably the fastest ORM for Android); our benchmarks are open
sourced too
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
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
Buka file build.gradle ( module:app ) lalu tambahkan beberapa code seperti berikut :
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
29
31
33
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
#NOTE :
Untuk penambahan kodenya kalian hanya cukup meng-copy paste / mengetik yang ada tanda “Add
this line”nya saja.
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.
Buatlah sebuah package folder dengan nama – nama folder sebagai berikut :
-create
-edit
-home
-utils
–database
Cara Membuat CRUD SQLite Database Android Studio-1
Didalem folder database tambahkan class baru dengan nama TblPengeluaran. Lalu isi dengan kode
berikut :
1 @Entity
3
4 @Id(autoincrement = true)
6
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 /**
9 * website : https://farizdotid.com/
10 * github : https://github.com/farizdotid
11 * linkedin : https://www.linkedin.com/in/farizramadhan/
12 */
13 @Entity
15
16 @Id(autoincrement = true)
18
21 @Generated(hash = 388400954)
23 this.idTblPengeluaran = idTblPengeluaran;
24 this.pengeluaran = pengeluaran;
25 this.nominal = nominal;
26 }
27 @Generated(hash = 177408923)
28 public TblPengeluaran() {
29 }
31 return this.idTblPengeluaran;
32 }
34 this.idTblPengeluaran = idTblPengeluaran;
35 }
37 return this.pengeluaran;
38 }
40 this.pengeluaran = pengeluaran;
41 }
43 return this.nominal;
44 }
46 this.nominal = nominal;
47 }
48 }
Tambahkan class baru dengan nama DaoHandler lalu tambahkan fungsi static untuk memanggil
DaoSession. Untuk kodenya seperti berikut :
#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.
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 /*
4 */
8 return formatRupiah.format(nominal);
9}
Pada folder atau package create tambahkan activity baru dengan nama CreateActivity.
CreateActivity ini untuk membuat data sesuai dengan kebutuhan user.
Buka layout activity_create, Lalu isi dengan beberapa widget seperti ini :
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;
7
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
13
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
12
13 @Override
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
30
Pada package edit buatlah sebuah dialog fragment dengan nama EditDialogFragment. Lalu isi dengan
kode berikut :
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
12
16
20
21 public EditDialogFragment() {
22 }
23
24 @Override
26 super.onAttach(context);
28 }
29
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
42 super.onCreate(savedInstanceState);
43 setStyle(DialogFragment.STYLE_NORMAL, R.style.Theme_AppCompat_Light_Dialog_Alert);
44
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
80 }
81
82 @Override
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
99 */
102 }
}
Pada package home buatlah sebuah class adapter dengan nama PengeluaranAdapter. Untuk
kodenya seperti ini :
3
5
8
33 }
34
35 @Override
37 return list.size();
38 }
39
42 this.list.clear();
43 notifyItemRangeRemoved(0, size);
44 }
45
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
56 super(itemView);
57 ButterKnife.bind(this, itemView);
58
59 ivDelete.setOnClickListener(new View.OnClickListener() {
60 @Override
63 }
64 });
65
66 itemView.setOnLongClickListener(new View.OnLongClickListener() {
67 @Override
69 mAdapterCallback.onLongClick(getAdapterPosition());
70 return true;
71 }
72 });
73 }
74 }
75
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 :
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>
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
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>
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
16
18
19 @Override
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();
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
45 }
46 });
47 }
48
49 /*
52 */
53 @Override
55 long id = tblPengeluaranList.get(position).getIdTblPengeluaran();
58
59 FragmentManager fm = getSupportFragmentManager();
71 showDialogDelete(position, name);
72 }
73
74 /*
75 Fungsi untuk men-totalkan semua nominal yang ada didalam tabel TblPengeluaran.
76 */
78 int total = 0;
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 /*
101 */
103 daoSession.getTblPengeluaranDao().deleteByKey(idTbl);
104
105 tblPengeluaranList.remove(position);
106 pengeluaranAdapter.notifyItemRemoved(position);
108
109 tvTotal.setText(FunctionHelper.convertRupiah(getTotal()));
110
111 dialog.dismiss();
112 }
113 });
114
115 builder1.setNegativeButton(
116 "Tidak",
119 dialog.cancel();
120 }
121 });
122
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
Screenshot Aplikasi