Android Studio CRUD dengan SQLite dan ListView

Pemrograman Android saat ini sedang naik daun. Berbagai perusahaan banyak membutuhkan seorang programmer Android yang handal. Nah, untuk kalian yang baru mengenal dunia programming atau sedang mendalaminya, ada baiknya untuk menguasai CRUD.

Requirements :
– Dasar-dasar pemrograman
– Android Studio (Versi Bebas)
– Emulator (Bebas) / Perangkat Asli

Tahap 1 – Membuat Project Baru

Pada menu Create New Project,
Application name : Nama aplikasi anda.
Company domain : Berfungsi sebagai nama package, bisa di ganti atau biarkan default.
Project location : Tempat dimana project anda akan disimpan, bisa di ganti atau biarkan default.
Package name : Merupakan gabungan dari Company domain dan diikuti oleh Application name.

Next.

 

Menu Target Android Devices berguna untuk memilih dimana aplikasi kita akan berjalan atau dapat digunakan. Dibawah opsi terdapat menu pilihan berisikan daftar API. API disini adalah versi android. Jika kita pilih API 19 berarti aplikasi ini hanya dapat berjalan pada versi OS android KitKat atau atau android 4.4 keatas.

Pilihlah API yang sesuai. Jangan versi terlalu lawas dan jangan juga yang terlalu baru karena akan mempengaruhi kode aplikasi yang kita buat.

Pilih API 19: Android 4.4 (KitKat), Next.

 

Menu selanjutnya berfungsi untuk memilih layout seperti apa yang akan kita buat pertama kali. Android studio sudah menyediakan beberapa tampilan layout yang siap kita pakai.

Pilih Basic Activity, Next.

 

Biarkan isian tersebut, lalu klik Finish. Android Studio akan mulai loading project dan mungkin akan membutuhkan waktu yang agak lama tergantung spesifikasi komputer/laptop anda.

Tahap 2 – Inisiasi Gradle

Setelah peoject selesai di load. pada list file project, sub-menu dari Gradle Script, buka build.gradle (Module: App) dan masukan script berikut sebelum kurung kurawal paling bawah. Lalu akan muncul sebuah pesan box berwarna kuning menandakan project telah berubah. Lalu tekan Sync Now  pada box tersebut.

compile 'com.android.support:recyclerview-v7:26.1.0'
compile 'com.android.support:cardview-v7:26.1.0'

Tahap 3 – Koding

Berikut adalah struktur project yang akan kita buat. Sebelum kita mulai koding sebaiknya buatlah semua file berikut agar tidak terjadi error. Pada folder app, Klik kanan -> new -> Activity -> Empty Activity, Pada Activity name masukan nama BuatBiodataActivity. Lakukan hal tersebut sampai semua file terbuat.

 

XML Layout

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.hevadevelop.reza.crud.MainActivity">

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

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        app:srcCompat="@android:drawable/ic_dialog_email" />

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

 

content_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.hevadevelop.reza.crud.MainActivity"
    tools:showIn="@layout/activity_main">

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </ListView>


</android.support.constraint.ConstraintLayout>

 

activity_lihat_biodata.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp"
    android:orientation="vertical">

    <TextView
        android:id="@+id/txtNomor"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="16sp"/>
    <TextView
        android:id="@+id/txtNama"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="16sp"/>
    <TextView
        android:id="@+id/txtTglLahir"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="16sp"/>
    <TextView
        android:id="@+id/txtJenKel"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="16sp"/>
    <TextView
        android:id="@+id/txtAlamat"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="16sp"/>

    <Button
        android:id="@+id/btnKembali"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Kembali"/>

</LinearLayout>

 

activity_buat_biodata.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:padding="10dp">

            <TextView
                android:labelFor="@+id/txtNama"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:paddingTop="10dp"
                android:text="Nama"
                android:textSize="16sp"/>
            <EditText
                android:id="@+id/txtNama"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textSize="16sp">
                <requestFocus/>
            </EditText>

            <TextView
                android:labelFor="@+id/txtTglLahir"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:paddingTop="10dp"
                android:text="Tanggal Lahir"
                android:textSize="16sp"/>
            <EditText
                android:id="@+id/txtTglLahir"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:clickable="true"
                android:inputType="date"
                android:focusable="false"/>

            <TextView
                android:labelFor="@+id/txtJenKel"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:paddingTop="10dp"
                android:text="Jenis Kelamin"
                android:textSize="16sp"/>
            <Spinner
                android:id="@+id/txtJenKel"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:entries="@array/jenisKelamin">
            </Spinner>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
                <Button
                    android:id="@+id/btnSimpan"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="Simpan"/>
                <Button
                    android:id="@+id/btnKembali"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="Kembali"/>
            </LinearLayout>

        </LinearLayout>

    </ScrollView>

</LinearLayout>

 

activity_update_biodata.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:padding="10dp">

            <TextView
                android:labelFor="@+id/txtNama"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:paddingTop="10dp"
                android:text="Nama"
                android:textSize="16sp"/>
            <EditText
                android:id="@+id/txtNama"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textSize="16sp">
                <requestFocus/>
            </EditText>

            <TextView
                android:labelFor="@+id/txtTglLahir"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:paddingTop="10dp"
                android:text="Tanggal Lahir"
                android:textSize="16sp"/>
            <EditText
                android:id="@+id/txtTglLahir"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:clickable="true"
                android:inputType="date"
                android:focusable="false"/>

            <TextView
                android:labelFor="@+id/txtJenKel"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:paddingTop="10dp"
                android:text="Jenis Kelamin"
                android:textSize="16sp"/>
            <Spinner
                android:id="@+id/txtJenKel"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:entries="@array/jenisKelamin">
            </Spinner>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
                <Button
                    android:id="@+id/btnSimpan"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="Simpan"/>
                <Button
                    android:id="@+id/btnKembali"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="Kembali"/>
            </LinearLayout>

        </LinearLayout>

    </ScrollView>

</LinearLayout>

 

values -> array.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <array name="jenisKelamin">
        <item>Laki-laki</item>
        <item>Perempuan</item>
    </array>
</resources>

 

Java Class

Buat package baru dan beri nama Helper. lalu di dalam package helper buat java class dan beri nama DataHelper.

DataHelper.class

package com.hevadevelop.reza.crud.Helper;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DataHelper extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "biodata.db";
    private static final int DATABASE_VERSION = 1;
    public String TABLE_NAME = "biodata";

    public DataHelper(Context context){
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE "+TABLE_NAME+"(" +
                "no INTEGER PRIMARY KEY AUTOINCREMENT," +
                "nama TEXT NULL," +
                "tgl TEXT NULL," +
                "jk TEXT NULL);";

        Log.d("Data", "onCreate: "+sql);
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
        
    }
}

 

MainActivity.class

package com.hevadevelop.reza.crud;

import android.annotation.SuppressLint;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.hevadevelop.reza.crud.Helper.DataHelper;

public class MainActivity extends AppCompatActivity {

    String[] daftar, listNama;
    ListView listView;
    FloatingActionButton fab;
    DataHelper dbHelper;
    protected Cursor cursor;
    @SuppressLint("StaticFieldLeak")
    public static MainActivity ma;

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

        fab = findViewById(R.id.fab);
        listView = findViewById(R.id.listView1);
        dbHelper = new DataHelper(this);
        ma = this;

        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this,
                        BuatBiodataActivity.class);
                startActivity(intent);
            }
        });

        refreshList();
    }

    public void refreshList() {
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        cursor = db.rawQuery("SELECT * FROM biodata", null);
        daftar = new String[cursor.getCount()];
        listNama = new String[cursor.getCount()];
        cursor.moveToFirst();

        for (int cc = 0; cc < cursor.getCount(); cc++) {
            cursor.moveToPosition(cc);
            daftar[cc] = cursor.getString(0);
            listNama[cc] = cursor.getString(1);
        }

        listView.setAdapter(new ArrayAdapter<>(this,
                android.R.layout.simple_list_item_1, listNama));
        listView.setSelected(true);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView adapterView, View view, int i, long l) {
                final String selection = daftar[i];
                final String showNama = listNama[i];
                final CharSequence[] dialogItem = {
                        "Lihat Biodata",
                        "Update Biodata",
                        "Hapus Biodata"
                };
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setTitle("Pilihan");
                builder.setItems(dialogItem, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        switch (i) {
                            case 0:
                                Intent read = new Intent(getApplicationContext(),
                                        LihatBiodataActivity.class);
                                read.putExtra("no", selection);
                                startActivity(read);
                                break;
                            case 1:
                                Intent update = new Intent(getApplicationContext(),
                                        UpdateBiodataActivity.class);
                                update.putExtra("no", selection);
                                startActivity(update);
                                break;
                            case 2:
                                String msg = "Data "+showNama+" terhapus!";
                                showPopup(msg);
                                SQLiteDatabase db = dbHelper.getReadableDatabase();
                                db.delete(dbHelper.TABLE_NAME, "no = ?",
                                        new String[]{selection});
                                refreshList();
                                break;
                        }
                    }
                });
                builder.show();
            }
        });
        ((ArrayAdapter) listView.getAdapter()).notifyDataSetInvalidated();
    }

    public void showPopup(String msg) {
        Snackbar.make(findViewById(R.id.layout), msg, Snackbar.LENGTH_SHORT)
                .setAction("Pesan", null).show();
    }

}

 

LihatBiodataActivity.class

package com.hevadevelop.reza.crud;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.hevadevelop.reza.crud.Helper.DataHelper;

public class LihatBiodataActivity extends AppCompatActivity {

    protected Cursor cursor;
    DataHelper dbHelper;
    Button btnKembali;
    TextView txtNama, txtTglLahir, txtJenKel;

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

        dbHelper = new DataHelper(this);

        txtNama = findViewById(R.id.txtNama);
        txtTglLahir = findViewById(R.id.txtTglLahir);
        txtJenKel = findViewById(R.id.txtJenKel);

        btnKembali = findViewById(R.id.btnKembali);

        String no = getIntent().getStringExtra("no");
        String table = dbHelper.TABLE_NAME;
        String query = "SELECT*FROM "+table+" WHERE no = ?";

        SQLiteDatabase db = dbHelper.getReadableDatabase();

        cursor = db.rawQuery(query, new String[] {no});
        cursor.moveToFirst();
        if (cursor.getCount()>0) {
            cursor.moveToPosition(0);
            txtNama.setText(cursor.getString(1));
            txtTglLahir.setText(cursor.getString(2));
            txtJenKel.setText(cursor.getString(3));
        }

        btnKembali.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });

    }
}

 

BuatBiodataActivity.class

package com.hevadevelop.reza.crud;

import android.app.DatePickerDialog;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Spinner;

import com.hevadevelop.reza.crud.Helper.DataHelper;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

public class BuatBiodataActivity extends AppCompatActivity {

    String nama, tgl, jk;
    DataHelper dbHelper;
    Button btnSimpan, btnKembali;
    EditText txtNama, txtTglLahir;
    Spinner txtJenKel;
    Calendar calendar;

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

        dbHelper = new DataHelper(this);

        calendar = Calendar.getInstance();

        txtNama = findViewById(R.id.txtNama);
        txtTglLahir = findViewById(R.id.txtTglLahir);
        txtJenKel = findViewById(R.id.txtJenKel);

        btnSimpan = findViewById(R.id.btnSimpan);
        btnKembali = findViewById(R.id.btnKembali);

        final DatePickerDialog.OnDateSetListener date = new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int month, int day) {
                calendar.set(Calendar.YEAR, year);
                calendar.set(Calendar.MONTH, month);
                calendar.set(Calendar.DAY_OF_MONTH, day);
                updateLabel();
            }
        };

        txtTglLahir.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new DatePickerDialog(BuatBiodataActivity.this, date,
                        calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
                        calendar.get(Calendar.DAY_OF_MONTH)).show();
            }
        });

        btnSimpan.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                nama = txtNama.getText().toString();
                tgl = txtTglLahir.getText().toString();
                jk = txtJenKel.getSelectedItem().toString();

                SQLiteDatabase db = dbHelper.getWritableDatabase();
                ContentValues value = new ContentValues();

                value.put("nama", nama);
                value.put("tgl", tgl);
                value.put("jk", jk);

                db.insert(dbHelper.TABLE_NAME, "no", value);

                MainActivity.ma.refreshList();
                MainActivity.ma.showPopup("Data berhasil di simpan!");
                finish();
            }
        });

        btnKembali.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });
    }

    private void updateLabel() {
        String dateFormat = "dd/MM/yyyy";
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat, Locale.US);

        txtTglLahir.setText(sdf.format(calendar.getTime()));
    }
}

 

UpdateBiodataActivity.class

package com.hevadevelop.reza.crud;

import android.app.DatePickerDialog;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Spinner;

import com.hevadevelop.reza.crud.Helper.DataHelper;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

public class UpdateBiodataActivity extends AppCompatActivity {

    protected Cursor cursor;
    DataHelper dbHelper;
    String no, nama, tgl, jk;
    Button btnSimpan, btnKembali;
    EditText txtNama, txtTglLahir;
    Spinner txtJenKel;
    Calendar calendar;

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

        dbHelper = new DataHelper(this);

        calendar = Calendar.getInstance();

        txtNama = findViewById(R.id.txtNama);
        txtTglLahir = findViewById(R.id.txtTglLahir);
        txtJenKel = findViewById(R.id.txtJenKel);

        btnSimpan = findViewById(R.id.btnSimpan);
        btnKembali = findViewById(R.id.btnKembali);

        final DatePickerDialog.OnDateSetListener date = new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int month, int day) {
                calendar.set(Calendar.YEAR, year);
                calendar.set(Calendar.MONTH, month);
                calendar.set(Calendar.DAY_OF_MONTH, day);
                updateLabel();
            }
        };

        txtTglLahir.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new DatePickerDialog(UpdateBiodataActivity.this, date,
                        calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
                        calendar.get(Calendar.DAY_OF_MONTH)).show();
            }
        });

        no = getIntent().getStringExtra("no");
        String table = dbHelper.TABLE_NAME;
        String query = "SELECT*FROM "+table+" WHERE no = ?";

        SQLiteDatabase db = dbHelper.getReadableDatabase();

        cursor = db.rawQuery(query, new String[]{no});
        cursor.moveToFirst();

        if (cursor.getCount()>0) {

            String tglLahir = cursor.getString(2);
            int aTgl = Integer.parseInt(tglLahir.substring(1,2));
            int aBln = Integer.parseInt(tglLahir.substring(4,5));
            int aThn = Integer.parseInt(tglLahir.substring(7,10));

            calendar.set(aThn, aBln-1, aTgl);

            cursor.moveToPosition(0);
            txtNama.setText(cursor.getString(1));
            txtTglLahir.setText(cursor.getString(2));
            txtJenKel.setSelection(getIndex(txtJenKel, cursor.getString(3)));
        }

        btnSimpan.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                nama = txtNama.getText().toString();
                tgl = txtTglLahir.getText().toString();
                jk = txtJenKel.getSelectedItem().toString();

                SQLiteDatabase db = dbHelper.getWritableDatabase();
                ContentValues value = new ContentValues();

                value.put("nama", nama);
                value.put("tgl", tgl);
                value.put("jk", jk);

                db.update(dbHelper.TABLE_NAME, value,
                        "no = ?", new String[]{no});

                Snackbar.make(view, "Berhasil", Snackbar.LENGTH_SHORT)
                        .setAction("Pesan", null).show();
                MainActivity.ma.refreshList();
                MainActivity.ma.showPopup("Data berhasil di update!");
                finish();
            }
        });

        btnKembali.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });

    }

    private int getIndex(Spinner spinner, String myString) {
        int index = 0;

        for (int i=0;i<spinner.getCount();i++) {
            if (spinner.getItemAtPosition(i).toString().equalsIgnoreCase(myString)){
                index = i;
                break;
            }
        }
        return index;
    }

    private void updateLabel() {
        String dateFormat = "dd/MM/yyyy";
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat, Locale.US);

        txtTglLahir.setText(sdf.format(calendar.getTime()));
    }
}

Tahap 4 – Finish Project

Setelah semua kodingan ditulis maka project kita siap dijalankan! Project bisa dijalankan melalui emulator atau perangkat asli. Project ini juga bisa di download melalui Github.

Download Source Code

Jika ada error silakan tanyakan di kolom komentar. Cheers!

1 comments On Android Studio CRUD dengan SQLite dan ListView

Leave a reply:

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Site Footer