Modul Pertemuan 10 Proyek Data Persistence PDF
Modul Pertemuan 10 Proyek Data Persistence PDF
PERTEMUAN 10
Proyek : Aplikasi Data Persistence Pada Mobile
KATA PENGANTAR
Alhamdulillahirobbila’lamin. Puji syukur kepada Allah SWT, Tuhan Yang Maha Kuasa, yang telah memberikan
rahmat-Nya sehingga Modul Pelatihan Junior Mobile Programmer Pertemuan ke-10 Proyek Aplikasi Data
Persistence Pada Mobile ini dapat diselesaikan dengan sebaik-baiknya.
Modul pelatihan ini diharapkan dapat membantu peserta dalam memahami topik data persistence pada pertemuan
ke-9. Modul pelatihan berisi instruksi untuk membuat aplikasi sederhana dengan memanfaatkan data persistence.
Penyusun menyakini bahwa dalam pembuatan modul pelatihan ini masih jauh dari sempurna. Oleh karena itu
penyusun mengharapkan kritik dan saran yang membangun guna penyempurnaan modul pelatihan ini dimasa yang
akan datang.
Akhir kata, penyusun mengucapkan banyak terima kasih kepada semua pihak yang telah membantu baik secara
langsung maupun tidak langsung.
2
DAFTAR ISI
1. PENDAHULUAN ............................................................................................................................................... 4
4. KESIMPULAN ................................................................................................................................................. 45
3
1. PENDAHULUAN
Setelah mempelajari data persistence pada pertemuan sebelumnya, di sesi ini anda akan membuat proyek aplikasi
sederhana dengan memanfaatkan data persistence. Proyek aplikasi yang akan dibuat adalah :
Untuk selanjutnya anda dapat mengikuti langkah demi langkah sesuai instruksi pada halaman selanjutnya.
4
2. APLIKASI CATATAN HARIAN
Pada Proyek 1, anda akan membuat aplikasi catatan harian yang akan menyimpan catatan harian anda pada file teks.
Catatan harian yang disimpan berupa nama file dan isi catatan. Semua catatan yang telah disimpan akan
dimunculkan dalam bentuk list. Pertama kali dijalankan aplikasi akan memunculkan splahscreen, lalu akan masuk
ke halaman utama yang berisi daftar catatan yang telah dibuat. Aplikasi ini memiliki fungsional untuk menambah
catatan, mengubah, menghapus, dan membaca daftar catatan.
Proyek ini merupakan latihan implementasi untuk penyimpanan file (data persistence) menggunakan external
storage. Untuk lebih jelasnya silahkan perhatikan beberapa tampilan berikut ini :
Gambar 1. Tampilan Splashscreen Gambar 2. Tampilan Halaman Utama Gambar 3. Tampilan Halaman Tambah Gambar 4. Tampilan Konfirmasi Hapus
Catatan Catatan
5
Membuat Proyek Baru
1. Buatlah sebuah proyek baru pada android studio, dan berikan nama pada proyek yang akan anda buat
(sebagai contoh Proyek1). Jangan lupa pastikan project ini menggunakan java 1.8, sehingga bisa
menggunakan lambda expression.
Name : Proyek1
Package Name : kominfo.go.id.storage.proyek1
Save Location : D:\Android-Latihan\Proyek1 (sesuaikan)
Language : Java
Minimum API Level : API 21: Android 5.0 (Lollipop)
6
Gambar 6. Tuliskan nama proyek dan package
7
Gambar 7. Tambahkan Activity SplashScreen
8
Gambar 9. Struktur Layout Komponennya
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:orientation="vertical"
tools:ignore="UseCompoundDrawables,UselessParent">
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:fitsSystemWindows="true"
android:src="@drawable/logo"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="PROYEK 1"
android:textColor="#000"
android:textSize="30sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</RelativeLayout>
import android.content.Intent;
import android.os.Handler;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash_screen);
9
new Handler().postDelayed(() -> {
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
}, 3000);
}
}
6. Buatlah sebuah Activity, beri nama kelas MainActivity.java beserta file layout dengan nama
activity_main.xml.
10
Gambar 11. Desain Tampilan pada activity_main
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="?attr/actionBarTheme" />
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"/>
</LinearLayout>
11
9. Buat file menu.xml sebagai menu pada folder res > menu dan sesuai kode xmlnya sebagai berikut :
<item
android:id="@+id/miTambah"
android:icon="@android:drawable/ic_menu_add"
android:orderInCategory="300"
android:title="Tambah"
app:showAsAction="ifRoom"></item>
</menu>
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import androidx.annotation.NonNull;
12
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//views to object
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
if (getSupportActionBar() != null)
getSupportActionBar().setTitle("Aplikasi Catatan Proyek 1");
listView = findViewById(R.id.listView);
//lisView longClick
listView.setOnItemLongClickListener((parent, view, position, id) -> {
//convert object to Map
Map<String, Object> data = (Map<String, Object>) parent.getAdapter().getItem(position);
return true;
});
@Override
protected void onResume() {
super.onResume();
if (Build.VERSION.SDK_INT >= 23) {
if (periksaIzinPenyimpanan()) {
showListFiles();
}
} else {
13
showListFiles();
}
}
return false;
}
} else {
return true;
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull
int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE_STORAGE)
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
showListFiles();
}
}
void showListFiles() {
String path = Environment.getExternalStorageDirectory() + "/kominfo.proyek1";
File directory = new File(path);
if (directory.exists()) {
File[] files = directory.listFiles();
String[] filenames = new String[files.length];
String[] dateCreated = new String[files.length];
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd MMM YYYY HH:mm:ss");
ArrayList<Map<String, Object>> itemDataList = new ArrayList<Map<String, Object>>();
listView.setAdapter(simpleAdapter);
simpleAdapter.notifyDataSetChanged();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
return true;
}
14
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.miTambah)
//aktifkan InsertAndViewActivity via explicit intent - non data
startActivity(new Intent(this, InsertAndViewActivity.class));
return super.onOptionsItemSelected(item);
}
showListFiles();
}
}
11. Selanjutnya, tambahkan Activity baru, berikan nama Activity dengan InsertAndViewActivity, serta nama
layout activity_insert_and_view.
15
12. Buatlah sebuah desain layout, dengan tampilan sebagaimana berikut :
13. Sesuaikan kode xml pada layout activity_insert_and_view sebagaimana kode berikut :
16
<?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:orientation="vertical"
tools:context=".InsertAndViewActivity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="?attr/actionBarTheme" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:text="Nama File : "
android:layout_marginTop="20dp"
android:textColor="#000"
android:textSize="12sp"
tools:ignore="HardcodedText" />
<EditText
android:id="@+id/etFilename"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="10dp"
android:padding="5dp"
android:singleLine="true"
android:textSize="14sp"
tools:ignore="Autofill,LabelFor,TextFields" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginBottom="5dp"
android:text="Catatan : "
android:textColor="#000"
android:textSize="12sp"
tools:ignore="HardcodedText" />
<EditText
17
android:id="@+id/etContent"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="10dp"
android:layout_weight="1"
android:gravity="top|start"
android:background="#E6DFDF"
android:singleLine="false"
android:padding="5dp"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="Autofill,LabelFor,TextFields" />
<Button
android:id="@+id/btSimpan"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="40dp"
android:background="@color/colorPrimary"
android:text="Simpan"
android:textAllCaps="false"
android:textColor="#FFF"
android:textSize="14sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</LinearLayout>
</LinearLayout>
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.EditText;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
18
public static final int REQUEST_CODE_STORAGE = 100;
private int eventID = 0;
private EditText etFileName;
private EditText etContent;
//boolean isEditable = false;
private String tempCatatan = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_insert_and_view);
//views to object
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
etFileName = findViewById(R.id.etFilename);
etContent = findViewById(R.id.etContent);
Button btSimpan = findViewById(R.id.btSimpan);
String fileName;
//event handler
btSimpan.setOnClickListener(v -> {
eventID = 2;
if (!tempCatatan.equals(etContent.getText().toString())) {
if (Build.VERSION.SDK_INT >= 23) {
if (periksaIzinPenyimpanan()) {
tampilSaveDialog();
}
} else {
tampilSaveDialog();
}
}
});
eventID = 1;
if (Build.VERSION.SDK_INT >= 23) {
if (periksaIzinPenyimpanan()) {
bacaFile();
}
} else {
bacaFile();
}
}
19
return false;
}
} else {
return true;
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
void bacaFile() {
String path = Environment.getExternalStorageDirectory().toString() + "/kominfo.proyek1";
File file = new File(path, etFileName.getText().toString());
if (file.exists()) {
try {
BufferedReader br = new BufferedReader(new FileReader(file));
tempCatatan = text.toString();
etContent.setText(text.toString());
}
}
void buatDanUbah() {
String state = Environment.getExternalStorageState();
if (!Environment.MEDIA_MOUNTED.equals(state)) {
return;
}
if (parent.exists()) {
File file = new File(path, etFileName.getText().toString());
osw.append(etContent.getText());
osw.flush();
fos.flush();
} catch (Exception e) {
e.printStackTrace();
}
20
else {
if(parent.mkdir()) return;
onBackPressed();
}
void tampilSaveDialog() {
new AlertDialog.Builder(this)
.setTitle("Simpan Catatan")
.setMessage("Apakah Anda yakin ingin menyimpan Catatan ini?")
.setIcon(android.R.drawable.ic_dialog_alert)
.setPositiveButton("YES", (dialog, whichButton) -> buatDanUbah())
.setNegativeButton("NO", null).show();
}
@Override
public void onBackPressed() {
if (!tempCatatan.equals(etContent.getText().toString())) {
tampilSaveDialog();
}
super.onBackPressed();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
onBackPressed();
}
return super.onOptionsItemSelected(item);
}
}
15. Jalankan aplikasi tersebut, lalu ujilah fungsionalitasnya baik untuk fungsi tambah, ubah, hapus, dan baca
data.
21
Gambar 17. Tampilan Form Tambah Catatan
22
Gambar 19. Tampilan Form Ubah Catatan
23
Catatan : Untuk menghapus data, tekan beberapa detik pada list, maka akan muncul konfirmasi hapus.
24
3. APLIKASI VALIDASI LOGIN
Pada Proyek 2, anda akan membuat aplikasi validasi login yang akan melakukan pengecekan terhadap data user
yang tersimpan pada file teks. Pertama kali dijalankan aplikasi akan memunculkan splahscreen, apabila user belum
teregistrasi, maka dapat melakukan registrasi pada halaman registrasi, apabila sudah memiliki akun dapat login
menggunakan akun tersebut pada halaman login. Setelah berhasil login, aplikasi akan masuk ke halaman utama yang
memunculkan data user. Tersedia juga tombol logout untuk keluar dari aplikasi.
Proyek ini merupakan latihan implementasi untuk penyimpanan file (data persistence) menggunakan internal
storage. Untuk lebih jelasnya silahkan perhatikan beberapa tampilan berikut ini :
Gambar 21. Tampilan Splashscreen Gambar 22. Tampilan Halaman Login Gambar 23. Tampilan Halaman Register Gambar 24. Tampilan Halaman Home
25
Gambar 25. Tambahkan Proyek Baru (Add No Activity)
26
Gambar 26. Tuliskan nama proyek dan package
27
Gambar 27. Tambahkan Activity SplashScreen
28
Gambar 29. Struktu Layout Komponennya
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:orientation="vertical"
tools:ignore="UseCompoundDrawables,UselessParent">
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:fitsSystemWindows="true"
android:src="@drawable/logo"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="PROYEK 2"
android:textColor="#000"
android:textSize="30sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</RelativeLayout>
import android.content.Intent;
import android.os.Bundle;
29
import android.os.Handler;
import androidx.appcompat.app.AppCompatActivity;
import java.io.File;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash_screen);
if (isLogin()) {
Intent intent = new Intent(SplashScreen.this, MainActivity.class);
startActivity(intent);
} else {
Intent intent = new Intent(SplashScreen.this, LoginActivity.class);
startActivity(intent);
}
finish();
}, 3000);
}
boolean isLogin() {
File sdcard = getFilesDir();
File file = new File(sdcard, FILENAME);
return file.exists();
}
30
Gambar 30. Tambahkan LoginActivity dan Layout activity_login
31
Gambar 32. Struktur Layout pada activity_main
<ImageView
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="40dp"
android:adjustViewBounds="true"
android:fitsSystemWindows="true"
android:src="@drawable/logo"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Username"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="HardcodedText" />
<EditText
android:id="@+id/etUsername"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="5dp"
android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"
android:inputType="textFilter"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="Autofill,LabelFor" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Password"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="HardcodedText" />
32
<EditText
android:id="@+id/etPassword"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="5dp"
android:inputType="textPassword"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="Autofill,LabelFor" />
<Button
android:id="@+id/btLogin"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="20dp"
android:background="@color/colorPrimary"
android:text="Login"
android:textColor="#FFF"
android:textSize="16sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/btRegister"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="20dp"
android:background="@color/colorPrimary"
android:text="Register"
android:textColor="#FFF"
android:textSize="16sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</LinearLayout>
import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//views to object
etUsername = findViewById(R.id.etUsername);
etPassword = findViewById(R.id.etPassword);
Button btLogin = findViewById(R.id.btLogin);
Button btRegister = findViewById(R.id.btRegister);
33
//event handler
btLogin.setOnClickListener(v -> login());
btRegister.setOnClickListener(v -> {
Intent intent = new Intent(this, RegisterActivity.class);
startActivity(intent);
});
}
void simpanFileLogin() {
String isiFile = etUsername.getText().toString() + ";" + etPassword.getText().toString();
File file = new File(getFilesDir(), FILENAME);
void login() {
File sdcard = getFilesDir();
File file = new File(sdcard, etUsername.getText().toString());
if (file.exists()) {
if (dataUser[1].equals(etPassword.getText().toString())) {
simpanFileLogin();
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
} else {
Toast.makeText(this, "Password Tidak Sesuai", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(this, "User Tidak Ditemukan", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onBackPressed() {
34
.setPositiveButton("YES", (dialog, which) -> finish())
.setNegativeButton("NO", null).show();
}
}
25. Selanjutnya, tambahkan Activity baru, berikan nama Activity dengan RegisterActivity, serta nama layout
activity_register.
35
Gambar 34. Desain Tampilan RegisterActivity
36
<?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:orientation="vertical"
tools:context=".RegisterActivity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="?attr/actionBarTheme" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20dp"
tools:ignore="ScrollViewSize">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Username"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="HardcodedText" />
<EditText
android:id="@+id/etUsername"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="5dp"
android:digits="abcdefghijklmnopqrstuvwxyz1234567890"
android:inputType="textFilter"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="Autofill,LabelFor" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Password"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="HardcodedText" />
37
<EditText
android:id="@+id/etPassword"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="5dp"
android:inputType="textPassword"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="Autofill,LabelFor" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Email"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="HardcodedText" />
<EditText
android:id="@+id/etEmail"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="5dp"
android:inputType="textEmailAddress"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="Autofill,LabelFor" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Nama Lengkap"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="HardcodedText" />
<EditText
android:id="@+id/etNamaLengkap"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="5dp"
android:inputType="textPersonName"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="Autofill,LabelFor" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Asal Sekolah"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="HardcodedText" />
38
<EditText
android:id="@+id/etAsalSekolah"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="5dp"
android:inputType="textPersonName"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="Autofill,LabelFor" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Alamat Tinggal"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="HardcodedText" />
<EditText
android:id="@+id/etAlamat"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:inputType="textMultiLine"
android:gravity="top|start"
android:lines="3"
android:padding="5dp"
android:singleLine="false"
android:textColor="#000"
android:textSize="14sp"
tools:ignore="Autofill,LabelFor" />
<Button
android:id="@+id/btSimpan"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="40dp"
android:background="@color/colorPrimary"
android:text="Simpan"
android:textColor="#FFF"
android:textSize="14sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</ScrollView>
</LinearLayout>
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
39
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import java.io.File;
import java.io.FileOutputStream;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
//views to object
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setTitle("Register");
}
etUsername = findViewById(R.id.etUsername);
etPassword = findViewById(R.id.etPassword);
etEmail = findViewById(R.id.etEmail);
etNamaLengkap = findViewById(R.id.etNamaLengkap);
etAsalSekolah = findViewById(R.id.etAsalSekolah);
etAlamat = findViewById(R.id.etAlamat);
//event handler
Button btSimpan = findViewById(R.id.btSimpan);
btSimpan.setOnClickListener(v -> {
if (isValidation())
simpanFileData();
else
Toast.makeText(this, "Mohon Lengkapi Seluruh Data", Toast.LENGTH_SHORT).show();
});
}
boolean isValidation() {
EditText[] ets = new EditText[]{
etUsername,
etPassword,
etEmail,
etNamaLengkap,
etAlamat,
etAsalSekolah
};
return false;
}
void simpanFileData() {
EditText[] ets = new EditText[]{
etUsername,
etPassword,
etEmail,
etNamaLengkap,
etAlamat,
etAsalSekolah
40
};
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
//local
EditText etPassword;
Button btSimpan;
TextView tvPassword;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
//views to object
41
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
etUsername = findViewById(R.id.etUsername);
tvPassword = findViewById(R.id.tvPassword);
etPassword = findViewById(R.id.etPassword);
etEmail = findViewById(R.id.etEmail);
etNamaLengkap = findViewById(R.id.etNamaLengkap);
etAsalSekolah = findViewById(R.id.etAsalSekolah);
etAlamat = findViewById(R.id.etAlamat);
btSimpan = findViewById(R.id.btSimpan);
etUsername.setEnabled(false);
tvPassword.setVisibility(View.GONE);
etPassword.setVisibility(View.GONE);
etEmail.setEnabled(false);
etNamaLengkap.setEnabled(false);
etAsalSekolah.setEnabled(false);
etAlamat.setEnabled(false);
btSimpan.setVisibility(View.GONE);
bacaFileLogin();
}
void bacaFileLogin() {
File sdcard = getFilesDir();
File file = new File(sdcard, FILENAME);
if (file.exists()) {
StringBuilder text = new StringBuilder();
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String line = br.readLine();
while (line != null) {
text.append(line);
line = br.readLine();
}
} catch (IOException e) {
System.out.println("Error " + e.getMessage());
}
if (file.exists()) {
StringBuilder text = new StringBuilder();
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String line = br.readLine();
while (line != null) {
text.append(line);
line = br.readLine();
}
} catch (IOException e) {
42
System.out.println("Error " + e.getMessage());
}
etUsername.setText(dataUser[0]);
etEmail.setText(dataUser[2]);
etNamaLengkap.setText(dataUser[3]);
etAsalSekolah.setText(dataUser[4]);
etAlamat.setText(dataUser[5]);
} else
Toast.makeText(this, "User Tidak Ditemukan", Toast.LENGTH_SHORT).show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.miLogout)
showLogoutDialog();
return super.onOptionsItemSelected(item);
}
void hapusFile() {
File file = new File(getFilesDir(), FILENAME);
void showLogoutDialog() {
new AlertDialog.Builder(this)
.setTitle("Confirmation Logout")
.setMessage("Anda yakin ingin Logout?")
.setIcon(android.R.drawable.ic_dialog_alert)
.setPositiveButton("YES", (dialog, whichButton) -> {
hapusFile();
30. Selanjutnya Jalankan aplikasi tersebut, lalu ujilah fungsionalitasnya baik untuk melakukan registrasi, login
dan logout.
43
Selamat, anda telah berhasil mengerjakan Proyek 2
44
4. KESIMPULAN
Sampai dengan tahap ini anda telah menyelesaikan 2 (dua) proyek aplikasi yang terkait dengan data persistence.
Pada aplikasi Proyek1, anda membuat aplikasi catatan harian dimana proses penyimpanannya menggunakan
external storage. Sedangkan pada aplikasi Proyek2, anda membuat aplikasi validasi login, dimana data user
disimpan pada internal storage. Dengan mempelajari kedua aplikasi tersebut, diharapkan anda sudah memahami
dengan baik fungsi data persistence, dan pemanfaatannya untuk aplikasi Android. Data persistence dapat
digunakan untuk menyimpan data apapun sesuai kebutuhan dalam bentuk file. Data ini bersifat tetap dan tidak
akan hilang selama tidak dihapus.
Demikian modul ini dibuat sebagai bahan pembelajaran untuk memahami implementasi secara praktis
pemanfaatan data persistence, semoga bermanfaat.
45
5. TIM PENYUSUN
46