Modul 09 PDF
Modul 09 PDF
Framework Android hadir dengan dukungan untuk persistence data dalam basis data relasional. Android
mengandalkan database embedded yang dikenal sebagai SQLite untuk memberi kekuatan pada fitur ini. framework
android menyediakan kelas wrapper dan method-method pembantu untuk berinteraksi dengan fungsi-fungsi pustaka
native SQLite dari ruang aplikasi.
SQLite merupakan open source database yang dirancang khusus untuk keperluan persistence data pada perangkat
elektronik dengan memori terbatas. SQLite mendukung penggunaan standar relational database seperti syntax SQL
dan transaction.
Setiap kolom pada table di SQLite dapat ditentukan dalam 5 kategori tipe data. Berikut 5 kategori tipe dan sub-sub
tipe data yang diperkenankan oleh SQLite :
Integer : Int, Integer, TinyInt, SmallInt, MediumInt, BeginT, Unsign Big Int, Int2, Int8
Text : Character, Varchar, Varying Character, Native Character, NVarChar, Text, Clob
Real : Real, Double, Double Precision, Float
Numeric : Numeric, Decimal, Boolean, Date, DateTime
SQLite Arsitektur
Dalam mengembangkan aplikasi android yang menggunakan persistence SQLite, kita memerlukan beberapa kelas
penting yang ada di package android.database. Kelas-kelas tersebut antara lain :
android.database.SQLiteOpenHelper
android.database.SQLiteDatabase
android.database.Cursor
Sebuah Database SQLite baru dapat dibuat hanya dengan mewarisi (extend) kelas abstract android.
database.sqlite.SQLiteOpenHelper yang menyediakan implementasi method onCreate dan onUpgrade. Listing
berikut, konstruktor SQLiteOpenHelper meminta parameter nama_database dan versi_database, selain parameter
context sekarang dan parameter cursor factory opsional.
Selama runtime, jika database tidak ada, metode onCreate dipanggil untuk membiarkan aplikasi menyiapkan database
dengan membuat tabel database. Jika database ada tetapi versi databasenya lebih rendah dari yang disediakan untuk
konstruktor, metode onUpgrade dipanggil untuk memungkinkan aplikasi melakukan langkah-langkah yang diperlukan
untuk memutakhirkan skema basis data.
Creating Table
Anda bisa membuat tabel-tabel database dalam method onCreate dengan menggunakan query SQL, seperti yang
ditunjukkan pada Listing dibawah ini. Android dengan simple menyediakan pembungkus di sekitar SQLite; semua
perintah SQL dan tipe data yang didukung oleh SQLite dapat digunakan Java.
Listing sql diatas membuat sebuah table address_book dengan kolom name dan email. Masing-masing bertipe text.
Untuk kolom name merupakan primary key. Kode sql tersebut kemudian dieksekusi sebagai parameter pada method
execSQL dari object SQLiteDabase – db.
Upgrading Database
Selama runtime, jika database yang ada memiliki versi yang lebih rendah, metode onUpgrade dipanggil dengan
parameter berupa oldVersion dan newVersion. Bergantung pada versi database yang ada, aplikasi dapat
menggunakan seperangkat statemen SQL untuk memutakhirkan skema database dan data ke versi yang lebih baru.
Seperti listing dibawah ini, statemen SQL ALTER TABLE dapat digunakan untuk memanipulasi tabel database.
Ada method yang disediakan oleh kelas SQLiteDatabase dalam memanipulasi database dan data, untuk mereka yang
terbiasa dengan statement sql dan mereka yang tidak. Bagian ini kita hanya membahas method yang menggunakan
statement sql saja, karena relatif lebih simple dan mudah dipahami.
1. Model penulisan :
a. CREATE, ALTER & DROP
b. INSERT, UPDATE & DELETE
Object SQLiteDatabase diperlukan untuk keperluan diatas, yang dapat dihasilkan dengan memanggil method :
a. this.getWritableDatabase()
b. this.getReadableDatabase()
contoh :
SQLiteDatabase db = getWritableDatabase();
SQLiteDatabase db = getReadableDatabase();
yang keduanya digunakan untuk keperluan penulisan ke database – table dan keperluan pembacaan dari database –
table. Bentuk method-method yang disediakan menggunakan parameter sql adalah sebagai berikut.
untuk menulis ke database dan table
getWritableDatabase().execSQL(sql); //sql tanpa parameter
getWritableDatabase().execSQL(sql, Object[] {}); //sql dg parameter
getReadableDatabase().execSQL(sql);
getReadableDatabase().execSQL(sql, Object[]{});
getWritableDatabase().rowQuery(sql, String[]{});
getReadableDatabase().rowQuery(sql, String[]{});
kedua method diatas akan mengembalikan object dari kelas android.database.Cursor. Pada object Cursor ini hasil query
akan ditampung, selanjutnya secara pemprograman hasil query tersebut dapat diekstrak dan dipergunakan.
Penyisipan data secara pemprograman dengan android dapat dilakukan menggunakan statement sql berparameter :
String sql = “insert into address_book values(?,?)”;
Kemudian string sql tersebut kita kirim kedalam method execSQL(sql, Object[]{}) untuk dieksekusi :
Update data juga lebih nyaman dilakukan dengan statement sql berparameter :
Untuk menghapus data di dalam table address_book, sqlnya dapat kita buat seperti ini :
String sql = “delete from address_book where name = ?”;
getWritableDatabase().execSQL(sql, new Object[]{“andi”});
Reading a Data Rows From Database
Untuk membaca baris-baris data dari table dapat menggunakan sql berparameter dan sql tanpa parameter yang
kemudian dieksekusi menggunakan method rowQuery. Method ini akan mengembalikan data hasil query yang
dapat kita tamping ke dalam object Cursor (android.database.Cursor). Dari object cursor ini hasil query dapat
kita ekstrak :
//tutup cursor
cursor.close()
If(cursor.moveFirst()){
do{
data.add(new AddressBook(cursor.getString(0), cursor.getString(1)));
//tutup cursor
cursor.close()
Untuk keperluan project kita database dan table dapat dilihat seperti dibawah ini :
Database : SQLite
DB_NAME : dts.db
DB_VERSION :2
Tabel : Friend (id, name, address, phone)
Desain dan listing antarmuka aplikasi kita dapat dilihat dibawah ini :
activity_main.xml
Ada beberapa package yang perlu kita buat pada proyek SQLiteTesting yang kita buat pada paket
id.ac.poliban.dts.roman.sqlitetesting yaitu :
dao dan domain. Pada package dao dibuat lagi package impl.
Friend.java
Interface FriendDao, merupakan interface yang akan diimplementasikan pada setiap kelas yang ingin mengakses
data dari object Friend (DAO = Data Access Object). Umumnya akses data meliputi kegiatan insert, update, delete,
get a data dan get all data.
Interface FriendDao.java
Letakkan kursor mouse di dekat “FriendDao” kemudian tekan tombol ALT + ENTER untuk memunculkan menu
Untuk Operasi Update, Delete dan Get A Friend (Select), kita harus inputkan dulu nilai ID-nya di EditText “Friend
ID”
Aplikasi Menyimpan data Teman
Proyek berikut merupakan proyek pembuatan aplikasi yang menyimpan data teman pada sebuah database SQLite
yang dinamai “dts.db.” Semua data yang diinput akan dimunculkan dalam bentuk list. Pertama-tama aplikasi akan
memunculkan splash screen, lalu masuk ke halaman utama yang berisi daftar teman yang telah disimpan. Aplikasi ini
berfungsi menambah, mengubah, menghapus dan melihat detail dari data teman.
halaman splash screen halaman utama Menu aksi halaman tambah data
berikut langkah-langkah pembuatan project diatas (jangan lupa untuk mengaktifkan source & target compatability ke
java 1.8 pada project anda).
Untuk keperluan project kita database dan table dapat dilihat seperti dibawah ini :
Database : SQLite
DB_NAME : dts.db
DB_VERSION :2
Tabel : Friend (id, name, address, phone1, phone2, phone3, email, hobbies)
Konfigurasi project
Membuat activity SplashScreen.java
Activity splash screen akan di launching pertama kali ketika aplikasi dijalankan (karena “launcher activity” di centang)
Membuat activity MainActivity.java
Membuat activity FriendView.java
Hasilnya adalah tiga buah activity seperti gambar disamping. Ingat, SplashScreen adalah activity yang telah kita
setting untuk dilaunching pertama kali.
Membuat kelas FriendDaoImpl yang mewarisi super kelas SQLiteOpenHelper dan mengimplementasikan interface
FriendDao. Kelas FriendDaoImpl diletakan pada package id.ac.poliban.dts.roman.sqlitedemo02.dao.impl.
<TextView
android:id="@+id/tvTitle"
android:text="Demo SQLite II"
android:textSize="18sp"
android:textColor="#000"
android:textStyle="bold"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dp"
android:layout_alignParentTop="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="HardcodedText" />
<ImageView
android:id="@+id/ivLogo"
android:src="@drawable/programming_language"
android:layout_marginTop="20dp"
android:adjustViewBounds="true"
android:layout_centerHorizontal="true"
android:layout_below="@+id/tvTitle"
android:layout_width="wrap_content"
android:contentDescription="@string/desc_logo"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tvSubtitle"
android:text="@string/desc_title"
android:textSize="20sp"
android:textStyle="bold"
android:textColor="#000"
android:layout_margin="40dp"
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tvYear"
android:text="@string/year"
android:textSize="14sp"
android:textColor="#000"
android:textStyle="bold"
android:layout_alignParentEnd="true"
android:layout_below="@id/ivLogo"
android:layout_margin="14dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
Listing SplashScreen.java
package id.ac.poliban.dts.roman.sqlitedemo02;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash_screen);
Kelas POJO (Plain Old Java Object) Friend.java sebagai layer antara model dan view dapat dilihat pada listing
dibawah ini. Perhatikan, Android Studio dan beberapa IDE lain memiliki cara membuat koding kelas POJO secara
otomatis.
Tekan tombol ALT + INSERT, untuk meng-generate “constructor”, method “getter & setter” dan meng-override
method “toString()”. Berikut Listing Friend.java :
package id.ac.poliban.dts.roman.sqlitedemo02.domain;
public Friend(String name, String address, String phone1, String phone2, String phone3, String
email, String hobbies) {
this.name = name;
this.address = address;
this.phone1 = phone1;
this.phone2 = phone2;
this.phone3 = phone3;
this.email = email;
this.hobbies = hobbies;
}
public Friend(int id, String name, String address, String phone1, String phone2, String phone3,
String email, String hobbies) {
this.id = id;
this.name = name;
this.address = address;
this.phone1 = phone1;
this.phone2 = phone2;
this.phone3 = phone3;
this.email = email;
this.hobbies = hobbies;
}
@Override
public String toString() {
return String.format("%-15s %-20s", getName(), getEmail());
}
}
import java.util.List;
import id.ac.poliban.dts.roman.sqlitedemo02.domain.Friend;
Klik kanan folder app, kemudian pilih New > Android Resource File.
Listing menu.xml :
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
Design activity_main.xml
Listing activity_main.xml
<?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"
tools:context=".MainActivity">
<ListView
android:id="@+id/list_view"
android:listSelector="#e0e0e0"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</LinearLayout>
Berikutnya kita membuat list_item.xml dan memformat TextView untuk mengisi ListView yang sudah kita siapkan
di activity_main.xml.
Klik kanan folder app, kemudian pilih New > Android Resource File.
Listing item_list.xml
<?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:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tvItem"
android:text="Hello World"
android:textSize="18sp"
android:textColor="#000"
android:padding="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="HardcodedText" />
</LinearLayout>
Listing FriendDaoImplSQLite.java
package id.ac.poliban.dts.roman.sqlitedemo02.dao.impl;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.util.ArrayList;
import java.util.List;
import id.ac.poliban.dts.roman.sqlitedemo02.dao.FriendDao;
import id.ac.poliban.dts.roman.sqlitedemo02.domain.Friend;
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table friend(" +
"id integer not null primary key autoincrement," +
"name text not null," +
"address text," +
"phone1 text not null," +
"phone2 text," +
"phone3 text," +
"email text not null," +
"hobbies text)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion == 1) {
String sql = "drop table if exists friend";
db.execSQL(sql);
onCreate(db);
}
}
@Override
public void insert(Friend f) {
String sql = "insert into friend values(?,?,?,?,?,?,?,?)";
getWritableDatabase().execSQL(sql, new Object[]{
null,
f.getName(),
f.getAddress(),
f.getPhone1(),
f.getPhone2(),
f.getPhone3(),
f.getEmail(),
f.getHobbies()
});
@Override
public void update(Friend f) {
String sql = "update friend set name=?, address=?, phone1=?, " +
"phone2=?, phone3=?, email=?, hobbies=? where id=?";
getWritableDatabase().execSQL(sql, new Object[]{
f.getName(),
f.getAddress(),
f.getPhone1(),
f.getPhone2(),
f.getPhone3(),
f.getEmail(),
f.getHobbies(),
f.getId()
});
}
@Override
public void delete(int id) {
String sql = "delete from friend where id=?";
getWritableDatabase().execSQL(sql, new Object[]{id});
}
@Override
public Friend getFriendById(int id) {
String sql = "select * from friend where id=?";
Cursor cursor = getReadableDatabase().rawQuery(sql, new
String[]{String.valueOf(id)});
if (cursor.moveToFirst())
return new Friend(
cursor.getInt(0),
cursor.getString(1),
cursor.getString(2),
cursor.getString(3),
cursor.getString(4),
cursor.getString(5),
cursor.getString(6),
cursor.getString(7)
);
else
return null;
}
@Override
public List<Friend> getAllFriends() {
List<Friend> fs = new ArrayList<>();
String sql = "select * from friend";
Cursor cursor = getReadableDatabase().rawQuery(sql, null);
while(cursor.moveToNext()){
fs.add(new Friend(
cursor.getInt(0),
cursor.getString(1),
cursor.getString(2),
cursor.getString(3),
cursor.getString(4),
cursor.getString(5),
cursor.getString(6),
cursor.getString(7)
));
}
cursor.close();
return fs;
}
}
Listing MainActivity.java
package id.ac.poliban.dts.roman.sqlitedemo02;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.List;
import id.ac.poliban.dts.roman.sqlitedemo02.dao.impl.FriendDaoImplSQLite;
import id.ac.poliban.dts.roman.sqlitedemo02.domain.Friend;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ds = new FriendDaoImplSQLite(this);
private void tampilkanMenu(AdapterView<?> parent, View view, int position, long id) {
final String[] items = {"Update", "Delete", "Show Detail", "None"};
new AlertDialog.Builder(this)
.setTitle("Action..")
.setIcon(android.R.drawable.ic_dialog_info)
.setItems(items, (dialog, which) -> {
if (items[which].equals("Update")) {
Friend f = (Friend) parent.getAdapter().getItem(position);
} else if (items[which].equals("Delete")) {
//ambil data dari list
Friend friend = (Friend) parent.getAdapter().getItem(position);
ds.delete(friend.getId());
data.remove(friend);
adapter.notifyDataSetChanged();
}
else if (items[which].equals("Show Detail")) {
//ambil data dari list
Friend f = (Friend) parent.getAdapter().getItem(position);
@Override
public void onBackPressed() {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == R.id.miAddAccount) {
Intent intent = new Intent(this, FriendView.class);
//kirim pesan via intent bahwa user ingin insert data
intent.putExtra("event", EVENT_INSERT);
startActivity(intent);
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onStart() {
super.onStart();
data.clear();
data.addAll(ds.getAllFriends());
adapter.notifyDataSetChanged();
}
}
Listing activity_friend_view.xml
<?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"
tools:context=".FriendView">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="UselessParent">
<LinearLayout
android:orientation="vertical"
android:padding="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tvId"
android:text="ID"
android:textSize="14sp"
android:textColor="#000"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="HardcodedText" />
<EditText
android:id="@+id/etID"
android:layout_marginTop="5dp"
android:inputType="text"
android:textSize="14sp"
android:textColor="#000"
android:layout_width="100dp"
android:layout_height="wrap_content"
tools:ignore="Autofill,LabelFor" />
<TextView
android:id="@+id/tvName"
android:text="Name *)"
android:textSize="14sp"
android:textColor="#000"
android:layout_marginTop="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="HardcodedText" />
<EditText
android:id="@+id/etName"
android:layout_marginTop="5dp"
android:inputType="textPersonName"
android:textSize="14sp"
android:textColor="#000"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="Autofill,LabelFor" />
<TextView
android:id="@+id/tvAddress"
android:text="Address"
android:textSize="14sp"
android:layout_marginTop="10dp"
android:textColor="#000"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="HardcodedText" />
<EditText
android:id="@+id/etAddress"
android:layout_marginTop="5dp"
android:inputType="textMultiLine"
android:textSize="14sp"
android:textColor="#000"
android:gravity="top|start"
android:layout_width="match_parent"
android:layout_height="90dp"
tools:ignore="Autofill,LabelFor" />
<TextView
android:id="@+id/tvPhone1"
android:text="Phone1"
android:textSize="14sp"
android:layout_marginTop="10dp"
android:textColor="#000"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="HardcodedText" />
<EditText
android:id="@+id/etPhone1"
android:layout_marginTop="5dp"
android:inputType="phone"
android:textSize="14sp"
android:textColor="#000"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="Autofill,LabelFor" />
<TextView
android:id="@+id/tvPhone2"
android:text="Phone2"
android:textSize="14sp"
android:layout_marginTop="10dp"
android:textColor="#000"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="HardcodedText" />
<EditText
android:id="@+id/etPhone2"
android:layout_marginTop="5dp"
android:inputType="phone"
android:textSize="14sp"
android:textColor="#000"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="Autofill,LabelFor" />
<TextView
android:id="@+id/tvPhone3"
android:text="Phone3"
android:textSize="14sp"
android:layout_marginTop="10dp"
android:textColor="#000"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="HardcodedText" />
<EditText
android:id="@+id/etPhone3"
android:layout_marginTop="5dp"
android:inputType="phone"
android:textSize="14sp"
android:textColor="#000"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="Autofill,LabelFor" />
<TextView
android:id="@+id/tvEmail"
android:text="Email *)"
android:textSize="14sp"
android:layout_marginTop="10dp"
android:textColor="#000"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="HardcodedText" />
<EditText
android:id="@+id/etEmail"
android:layout_marginTop="5dp"
android:inputType="textEmailAddress"
android:textSize="14sp"
android:textColor="#000"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="Autofill,LabelFor" />
<TextView
android:id="@+id/tvHobbies"
android:text="Hobbies"
android:textSize="14sp"
android:textColor="#000"
android:layout_marginTop="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="HardcodedText" />
<EditText
android:id="@+id/etHobbies"
android:layout_marginTop="5dp"
android:inputType="textMultiLine"
android:textSize="14sp"
android:textColor="#000"
android:gravity="top|start"
android:layout_width="match_parent"
android:layout_height="90dp"
tools:ignore="Autofill,LabelFor" />
<Button
android:id="@+id/btSimpan"
android:text="Simpan"
android:layout_marginTop="50dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="HardcodedText" />
</LinearLayout>
</ScrollView>
</LinearLayout>
Listing FriendView.java
package id.ac.poliban.dts.roman.sqlitedemo02;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import id.ac.poliban.dts.roman.sqlitedemo02.dao.impl.FriendDaoImplSQLite;
import id.ac.poliban.dts.roman.sqlitedemo02.domain.Friend;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_friend_view);
ds = new FriendDaoImplSQLite(this);
//views to objects
tvId = findViewById(R.id.tvId);
etId = findViewById(R.id.etID);
etName = findViewById(R.id.etName);
etAddress = findViewById(R.id.etAddress);
etPhone1 = findViewById(R.id.etPhone1);
etPhone2 = findViewById(R.id.etPhone2);
etPhone3 = findViewById(R.id.etPhone3);
etEmail = findViewById(R.id.etEmail);
etHobbies = findViewById(R.id.etHobbies);
btSimpan = findViewById(R.id.btSimpan);
//event handler
btSimpan.setOnClickListener(v -> {
if (!isValidate()) return;
onBackPressed();
});
}
@Override
protected void onStart() {
super.onStart();
case EVENT_UPDATE :
tvId.setVisibility(View.VISIBLE); //muncul
etId.setVisibility(View.VISIBLE);
etId.setEnabled(false);
etName.setEnabled(true); //bisa diedit
etAddress.setEnabled(true);
etPhone1.setEnabled(true);
etPhone2.setEnabled(true);
etPhone3.setEnabled(true);
etEmail.setEnabled(true);
etHobbies.setEnabled(true);
btSimpan.setVisibility(View.VISIBLE); //muncul
break;
case EVENT_VIEW :
tvId.setVisibility(View.VISIBLE); //muncul
etId.setVisibility(View.VISIBLE);
etId.setEnabled(false); //tidak bisa diedit
etName.setEnabled(false);
etAddress.setEnabled(false);
etPhone1.setEnabled(false);
etPhone2.setEnabled(false);
etPhone3.setEnabled(false);
etEmail.setEnabled(false);
etHobbies.setEnabled(false);
btSimpan.setVisibility(View.GONE); //lenyap
break;
}
}
private void tampilkanData(int id) {
Friend friend = ds.getFriendById(id);
etId.setText(String.valueOf(friend.getId()));
etName.setText(friend.getName());
etAddress.setText(friend.getAddress());
etPhone1.setText(friend.getPhone1());
etPhone2.setText(friend.getPhone2());
etPhone3.setText(friend.getPhone3());
etEmail.setText(friend.getEmail());
etHobbies.setText(friend.getHobbies());
}
Untuk referensi file AndroidManifest.xml dapat dilihat sepert gambar dibawah ini
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".FriendView" />
<activity android:name=".MainActivity" />
<activity
android:name=".SplashScreen"
android:theme="@style/Theme.AppCompat.Light.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</manifest>
https://github.com/rmantala/SQLiteDemo01
https://github.com/rmantala/SQLiteDemo02