0% menganggap dokumen ini bermanfaat (0 suara)
60 tayangan40 halaman

Modul 09 PDF

Dokumen tersebut membahas tentang penggunaan SQLite sebagai database relasional untuk persistence data dalam aplikasi Android. SQLite merupakan database embedded yang disediakan secara native oleh Android untuk tujuan tersebut. Dokumen menjelaskan konsep dasar SQLite, kelas-kelas yang tersedia untuk berinteraksi dengan SQLite dalam Android, serta cara membuat, memanipulasi, dan memperbarui database dan datanya menggunakan SQLite.

Diunggah oleh

Adam Coy
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
60 tayangan40 halaman

Modul 09 PDF

Dokumen tersebut membahas tentang penggunaan SQLite sebagai database relasional untuk persistence data dalam aplikasi Android. SQLite merupakan database embedded yang disediakan secara native oleh Android untuk tujuan tersebut. Dokumen menjelaskan konsep dasar SQLite, kelas-kelas yang tersedia untuk berinteraksi dengan SQLite dalam Android, serta cara membuat, memanipulasi, dan memperbarui database dan datanya menggunakan SQLite.

Diunggah oleh

Adam Coy
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 40

PERSISTENCE DATA DENGAN SQLITE

SQLite dan Android

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

Creating dan Opening Database

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.

Manipulasi Data SQLite dalam android

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.

Bentuk manipulasi data dan database ada dua model :

1. Model penulisan :
a. CREATE, ALTER & DROP
b. INSERT, UPDATE & DELETE

2. Model pembacaan : SELECT

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[]{});

untuk membaca data dari database dan tabel :

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.

Inserting data to Table

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 :

getWritableDatabase().execSQL(sql, new Object[]{“andi”, “[email protected]”});


getWritableDatabase().execSQL(sql, new Object[]{“andi”, “[email protected]”});

Updating data in Table

Update data juga lebih nyaman dilakukan dengan statement sql berparameter :

String sql = “update address_book set email=? Where name = ?”;

getWritableDatabase().execSQL(sql, new Object[]{“[email protected]”, “andi”});

Deleting Data in Database

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 :

SQL Query berparameter :

//sql query dengan parameter


String sql = “select * from address_book where name = ?”;

//sql dieksekusi tanpa menyertakan nilai parameter.


//hasil query ditampung di object cursor

Cursor cursor = getReadableDatabase().rowQuery(sql, new String[]{“andi”});

//ke record pertama


If(cursor.moveFirst()){

// lakukan ekstrak data dan


//simpan kedalam sebuah List address_book

data.add(new AddressBook(cursor.getString(0), cursor.getString(1)));


}

//tutup cursor
cursor.close()

SQL Query tanpa parameter :

//sql query tanpa parameter


String sql = “select * from address_book”;

//sql dieksekusi tanpa menyertakan nilai parameter.


//hasil query ditampung di object cursor

Cursor cursor = getReadableDatabase().rowQuery(sql, null);

//ke record pertama

If(cursor.moveFirst()){

//melalui perulangan lakukan ekstrak data dan


//simpan kedalam sebuah List address_book

do{
data.add(new AddressBook(cursor.getString(0), cursor.getString(1)));

}while(cursor.moveNext()); //lanjut ke record berikutnya hingga terakhir.


}

//tutup cursor
cursor.close()

Latihan Membuat program dengan SQLite

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)

Buat Project baru dengan ketentuan sebagai berikut :

 Template : Empty Activity


 Project Name : SQLiteTesting
 Package Name : id.ac.poliban.dts.roman.sqlitetesting (sesuaikan)
 Save Location : D:\Android-Latihan\SQLiteTesting (sesuaikan)
 Language : java
 Minimum API level : (sesuaikan – satu level dibawah OS smartphone anda)

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.

Beberapa kelas baru untuk kebutuhan program kita perlu


dibuatkan juga :

 Kelas Friend di package domain


 Interface FriendDao di package dao, dan
 Kelas FriendDaoImplSQLite di package impl
Pembuatan package dan kelas ini agar project kita menjadi lebih
ter organisir.
Kelas Friend.java pada package domain merupakan kelas POJO (Plain Old Java Object) yang merupakan kelas
sederhana untuk memetakan sebuah table. Hanya berisi beberapa atribut, ditambah method set & get serta toString
untuk memanipulasi atribut.

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

FriendDaoImplSQLite merupakan kelas yang mewarisi kelas abstract android.database.SQLOpenHelper.java


dan mengimplementasikan interface FriendDao. Untuk itu semua method-method abstract dari kelas SQLOpenHelper
dan Interface FriendDao harus diimplementasikan.

Letakkan kursor mouse di dekat “FriendDao” kemudian tekan tombol ALT + ENTER untuk memunculkan menu

“Implement methods”. Sehingga muncul menu


“select methods to implement” pastikan ketujuh
method abstract tersebut dipilih, lalu tekan OK.
FriendDaoImplSQLite.java
Project ini dibuat berfokus untuk memahami kerja insert, update, delete dan select dalam pemprograman database
android menggunakan SQLite, maka dibagian awal kelas MainActivity.java kita buat List yang akan digunakan untuk
meng-insert data awal kedalam table. Listing MainActivity.java dapat dilihat seperti berikut :
Untuk melihat output dapat dilihat pada bagian tab “Run”. Berikut contoh output dari aplikasi kita :

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

halaman update halaman detail

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)

Buat Project baru dengan ketentuan sebagai berikut :

Tambahkan project baru (add No


Activity)

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.

Kemudian, pada package


“id.ac.poliban.dts.roman.sqlitedemo02” klik kanan
dan buat package baru dengan nama :

 domain, berisi kelas-kelas model (POJO)


untuk berinteraksi dengan data.
 dao, berisi interface yang akan diterapkan
pada Kelas-kelas yang akan memanipulasi database
dan data.
 dao.impl, berisi kelas-kelas yang akan
menerapkan interface yang dibuat di dao.
Membuat kelas Friend didalam package “domain”

Klik kanan pada package “dao” buat interface FriendDao


Membuat kelas FriendDaoImplSQLite

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.

Sehingga struktur project kita seperti gambar dibawah ini :

Listing activity_splash_screen.xml adalah sebagai berikut :


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".SplashScreen">

<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>

Catatan : untuk gambar/logo silahkan ditentukan dan diatur sendiri.

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;

public class SplashScreen extends AppCompatActivity {

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

new Handler().postDelayed(() ->{


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

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 class Friend {


private int id;
private String name;
private String address;
private String phone1;
private String phone2;
private String phone3;
private String email;
private String hobbies;

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;
}

public int getId() {


return id;
}

public void setId(int id) {


this.id = id;
}

public String getName() {


return name;
}

public void setName(String name) {


this.name = name;
}

public String getAddress() {


return address;
}

public void setAddress(String address) {


this.address = address;
}

public String getPhone1() {


return phone1;
}

public void setPhone1(String phone1) {


this.phone1 = phone1;
}

public String getPhone2() {


return phone2;
}

public void setPhone2(String phone2) {


this.phone2 = phone2;
}

public String getPhone3() {


return phone3;
}

public void setPhone3(String phone3) {


this.phone3 = phone3;
}

public String getEmail() {


return email;
}

public void setEmail(String email) {


this.email = email;
}

public String getHobbies() {


return hobbies;
}

public void setHobbies(String hobbies) {


this.hobbies = hobbies;
}

@Override
public String toString() {
return String.format("%-15s %-20s", getName(), getEmail());
}
}

Listing Interface FriendDao.java


package id.ac.poliban.dts.roman.sqlitedemo02.dao;

import java.util.List;

import id.ac.poliban.dts.roman.sqlitedemo02.domain.Friend;

public interface FriendDao {


void insert(Friend f);
void update(Friend f);
void delete(int id);
Friend getFriendById(int id);
List<Friend> getAllFriends();
}

Membuat Tombol Tambah Teman dengan Menu Item

Klik kanan folder app, kemudian pilih New > Android Resource File.

isi New Resource File sesuai gambar diatas


menu.xml akan dibuat difolder res>menu

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">

<item android:title="Add Acount" android:id="@+id/miAddAccount"


android:icon="@android:drawable/ic_input_add"
app:showAsAction="ifRoom"
tools:ignore="HardcodedText" />
</menu>

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.

Isikan New Resource File seperti gambar diatas


File item_list.xml dibuatkan di folder res>layout

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;

import static id.ac.poliban.dts.roman.sqlitedemo02.MainActivity.DB_NAME;


import static id.ac.poliban.dts.roman.sqlitedemo02.MainActivity.DB_VERSION;

public class FriendDaoImplSQLite extends SQLiteOpenHelper implements FriendDao {

public FriendDaoImplSQLite(Context context) {


super(context, DB_NAME, null, DB_VERSION);
}

@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;

public class MainActivity extends AppCompatActivity {


public static final String DB_NAME = "dts.db";
public static final int DB_VERSION = 1;

public static final int EVENT_INSERT = 0;


public static final int EVENT_UPDATE = 1;
public static final int EVENT_VIEW = 2;

private List<Friend> data = new ArrayList<>();


private FriendDaoImplSQLite ds;
private ArrayAdapter adapter;

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

setTitle("Daftar Teman Dekat");

ds = new FriendDaoImplSQLite(this);

ListView listView = findViewById(R.id.list_view);


adapter = new ArrayAdapter(this, R.layout.item_list, R.id.tvItem, data);
listView.setAdapter(adapter);

listView.setOnItemLongClickListener((parent, view, position, id) -> {


tampilkanMenu(parent, view, position, id);
return true;
});
}

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);

Intent intent = new Intent(this, FriendView.class);


intent.putExtra("event", EVENT_UPDATE);
intent.putExtra("id", f.getId());
startActivity(intent);

} 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);

Intent intent = new Intent(this, FriendView.class);


//kirim pesan via intent, bahwa user ingin melihat detail data
intent.putExtra("event", EVENT_VIEW);
intent.putExtra("id", f.getId());
startActivity(intent);
}
})
.show();
}

@Override
public void onBackPressed() {

//konfirmasi ketika menutup aplikasi


new AlertDialog.Builder(this)
.setTitle("close confirmation")
.setMessage("close this app?")
.setIcon(android.R.drawable.ic_lock_power_off)
.setPositiveButton("YES", (dialog, which) -> finish())
.setNegativeButton("NO", null).show();
}

@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;

import static id.ac.poliban.dts.roman.sqlitedemo02.MainActivity.EVENT_INSERT;


import static id.ac.poliban.dts.roman.sqlitedemo02.MainActivity.EVENT_UPDATE;
import static id.ac.poliban.dts.roman.sqlitedemo02.MainActivity.EVENT_VIEW;

public class FriendView extends AppCompatActivity {


private FriendDaoImplSQLite ds;
private TextView tvId;
private EditText etId;
private EditText etName;
private EditText etAddress;
private EditText etPhone1;
private EditText etPhone2;
private EditText etPhone3;
private EditText etEmail;
private EditText etHobbies;
private Button btSimpan;

@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;

if(getIntent().getIntExtra("event", -1)== EVENT_INSERT){


Friend friend = new Friend(
etName.getText().toString(),
etAddress.getText().toString(),
etPhone1.getText().toString(),
etPhone2.getText().toString(),
etPhone3.getText().toString(),
etEmail.getText().toString(),
etHobbies.getText().toString());

ds.insert(friend); //sisipkan object Friend


}
else if(getIntent().getIntExtra("event", -1)==EVENT_UPDATE) {
Friend friend = new Friend(
Integer.parseInt(etId.getText().toString()),
etName.getText().toString(),
etAddress.getText().toString(),
etPhone1.getText().toString(),
etPhone2.getText().toString(),
etPhone3.getText().toString(),
etEmail.getText().toString(),
etHobbies.getText().toString());

ds.update(friend); //update friend


}

onBackPressed();
});
}

@Override
protected void onStart() {
super.onStart();

//uji apakah event INSERT atau VIEW


if (getIntent().getExtras() != null && getSupportActionBar() != null)
if (getIntent().getIntExtra("event", -1) == EVENT_INSERT) {
setTitle("Tambah Data Teman");
settingTampilan(EVENT_INSERT);
}
else if (getIntent().getIntExtra("event", -1) == EVENT_UPDATE) {
setTitle("Update Data Teman");
settingTampilan(EVENT_UPDATE);
tampilkanData(getIntent().getIntExtra("id", -1));
}
else if (getIntent().getIntExtra("event", -1) == EVENT_VIEW) {
setTitle("Detail Teman");
settingTampilan(EVENT_VIEW);
tampilkanData(getIntent().getIntExtra("id", -1));
}
}

private void settingTampilan(int event) {


switch (event){
case EVENT_INSERT :
tvId.setVisibility(View.GONE); //lenyap
etId.setVisibility(View.GONE);
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_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());
}

private boolean isValidate() {


EditText[] ets = new EditText[]{
etName, etEmail
};

//jika etName, dan etEmail kosong maka munculkan error


for (EditText et : ets) {
if (et.getText().toString().isEmpty()) {
et.setError("field harus diisi!");
return false;
}
}
return true;
}

Untuk referensi file AndroidManifest.xml dapat dilihat sepert gambar dibawah ini

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


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="id.ac.poliban.dts.roman.sqlitedemo02">

<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" />

<category android:name="android.intent.category.LAUNCHER" />


</intent-filter>
</activity>
</application>

</manifest>

Project silahkan lihat di :

 https://github.com/rmantala/SQLiteDemo01
 https://github.com/rmantala/SQLiteDemo02

Anda mungkin juga menyukai