Aplikasi Android CRUD |
Buat kalian yang belum tahu MySQL, MySQL adalah sebuah perangkat lunak sistem manajemen basis data SQL, atau DBMS yang multithread dan multi-user. MySQL adalah Relational Database Management System (RDBMS) yang berada dibawah lisensi GPL (General Public License). MySQL, sebenarnya merupakan turunan dari SQL. SQL (Structured Query Language) adalah sebuah konsep pengoperasian database, terutama untuk pemilihan atau seleksi dan pemasukan data, yang memungkinkan pengoperasian data dikerjakan dengan mudah secara otomatis.
CRUD (Create Read Update Delete) adalah sebuah sebutan untuk aplikasi dimana pengguna dapat menambah, mengedit dan menghapus data. Aplikasi CRUD Kontak ini menggunakan FAB (Floating Action Button) untuk mengisi datanya dalam bentuk Form. Semua data akan ditampilkan pada ListView. Untuk mengedit atau menghapus datanya, pengguna cukup tekan yang lama pada data yang ingin diubah atau dihapus. Sampai disini kalian sudah paham kan?😁
Oke tanpa basa-basi lagi langsung saja pertama membuat database dengan nama biodata dengan nama tabel kontak dan struktur tabelnya seperti berikut :
Field | Type | Lenght | Primary Key | Auto Increment |
---|---|---|---|---|
ID | int | 10 | ✔ | ✔ |
Nama | varchar | 50 | - | - |
Tlp | varchar | 12 | - | - |
varchar | 50 | - | - |
Struktur Database CRUD |
Letak Web Service |
koneksi.php
Sebagai koneksi aplikasi ke database. Coding-nya DISINI.
select.php
Sebagai koneksi aplikasi ke database. Coding-nya DISINI.
delete.php
Sebagai koneksi aplikasi ke database. Coding-nya DISINI.
edit.php
Sebagai koneksi aplikasi ke database. Coding-nya DISINI.
update.php
Sebagai koneksi aplikasi ke database. Coding-nya DISINI.
insert.php
Sebagai koneksi aplikasi ke database. Coding-nya DISINI.
1. Buat project baru di Android Studio dengan cara klik File ⇒ Project Baru. Ketika diminta untuk memilih Default Activity, pilih Empty Activity dan klik next. Untuk minSDK, disini saya set API 21 ya.
2. Untuk memanggil Web Service tadi, tambahkan library Volley di build.gradle :
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.android.support:design:28.0.0'
implementation 'com.mcxiaoke.volley:library:1.0.19'
}
3. Karena menggunakan koneksi internet, ubah Android Manifest.xml :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.azhar.crud">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:name=".app.AppController"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
3. Buat MainActivity.java. Class ini berfungsi menampilkan data dalam ListView dari Web Service Volley JsonArrayRequest. Setelah diparsing, semua data JSON Array akan disimpan pada objek Data.java. Terakhir memanggil notifyDataSetChanged() untuk perubahan data pada Adapter. Fungsi insert, update, delete, select, dan menampilkan form kontak juga ada didalam class ini.
package com.azhar.crud;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.VolleyLog;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.StringRequest;
import com.azhar.crud.adapter.KontakAdapter;
import com.azhar.crud.app.AppController;
import com.azhar.crud.data.Data;
import com.azhar.crud.util.Server;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by Azhar Rivaldi on 27/06/2019.
*/
public class MainActivity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener {
Toolbar toolbar;
FloatingActionButton fab;
ListView list;
SwipeRefreshLayout swipe;
List itemList = new ArrayList();
KontakAdapter adapter;
int success;
AlertDialog.Builder dialog;
LayoutInflater inflater;
View dialogView;
EditText txt_id, txt_nama, txt_tlp, txt_email;
String id, nama, tlp, email;
private static final String TAG = MainActivity.class.getSimpleName();
private static String url_select = Server.URL + "select.php";
private static String url_insert = Server.URL + "insert.php";
private static String url_edit = Server.URL + "edit.php";
private static String url_update = Server.URL + "update.php";
private static String url_delete = Server.URL + "delete.php";
public static final String TAG_ID = "id";
public static final String TAG_NAMA = "nama";
public static final String TAG_TLP = "tlp";
public static final String TAG_EMAIL = "email";
private static final String TAG_SUCCESS = "success";
private static final String TAG_MESSAGE = "message";
String tag_json_obj = "json_obj_req";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// menghubungkan variablel pada layout dan pada java
fab = (FloatingActionButton) findViewById(R.id.fab_add);
swipe = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout);
list = (ListView) findViewById(R.id.list);
// untuk mengisi data dari JSON ke dalam adapter
adapter = new KontakAdapter(MainActivity.this, itemList);
list.setAdapter(adapter);
// menamilkan widget refresh
swipe.setOnRefreshListener(this);
swipe.post(new Runnable() {
@Override
public void run() {
swipe.setRefreshing(true);
itemList.clear();
adapter.notifyDataSetChanged();
callVolley();
}
}
);
// fungsi floating action button untuk memanggil form kontak
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DialogForm("", "", "", "", "SIMPAN");
}
});
// listview ditekan lama akan menampilkan dua pilihan edit atau delete data
list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(final AdapterView parent, View view, final int position, long id) {
// TODO Auto-generated method stub
final String idx = itemList.get(position).getId();
final CharSequence[] dialogitem = {"Edit", "Delete"};
dialog = new AlertDialog.Builder(MainActivity.this);
dialog.setCancelable(true);
dialog.setItems(dialogitem, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
switch (which) {
case 0:
edit(idx);
break;
case 1:
delete(idx);
break;
}
}
}).show();
return false;
}
});
}
@Override
public void onRefresh() {
itemList.clear();
adapter.notifyDataSetChanged();
callVolley();
}
// untuk mengosongi edittext pada form
private void kosong() {
txt_id.setText(null);
txt_nama.setText(null);
txt_tlp.setText(null);
txt_email.setText(null);
}
// untuk menampilkan dialog form kontak
private void DialogForm(String idx, String namax, String tlpx, String emailx, String button) {
dialog = new AlertDialog.Builder(MainActivity.this);
inflater = getLayoutInflater();
dialogView = inflater.inflate(R.layout.form_kontak, null);
dialog.setView(dialogView);
dialog.setCancelable(true);
dialog.setIcon(R.drawable.ic_contact);
dialog.setTitle("Kontak");
txt_id = (EditText) dialogView.findViewById(R.id.txt_id);
txt_nama = (EditText) dialogView.findViewById(R.id.txt_nama);
txt_tlp = (EditText) dialogView.findViewById(R.id.txt_tlp);
txt_email = (EditText) dialogView.findViewById(R.id.txt_email);
if (!idx.isEmpty()) {
txt_id.setText(idx);
txt_nama.setText(namax);
txt_tlp.setText(tlpx);
txt_email.setText(emailx);
} else {
kosong();
}
dialog.setPositiveButton(button, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
id = txt_id.getText().toString();
nama = txt_nama.getText().toString();
tlp = txt_tlp.getText().toString();
email = txt_email.getText().toString();
simpan_update();
dialog.dismiss();
}
});
dialog.setNegativeButton("BATAL", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
kosong();
}
});
dialog.show();
}
// untuk menampilkan semua data pada listview
private void callVolley() {
itemList.clear();
adapter.notifyDataSetChanged();
swipe.setRefreshing(true);
// membuat request JSON
JsonArrayRequest jArr = new JsonArrayRequest(url_select, new Response.Listener() {
@Override
public void onResponse(JSONArray response) {
Log.d(TAG, response.toString());
// Parsing json
for (int i = 0; i < response.length(); i++) {
try {
JSONObject obj = response.getJSONObject(i);
Data item = new Data();
item.setId(obj.getString(TAG_ID));
item.setNama(obj.getString(TAG_NAMA));
item.setTlp(obj.getString(TAG_TLP));
item.setEmail(obj.getString(TAG_EMAIL));
// menambah item ke array
itemList.add(item);
} catch (JSONException e) {
e.printStackTrace();
}
}
// notifikasi adanya perubahan data pada adapter
adapter.notifyDataSetChanged();
swipe.setRefreshing(false);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
swipe.setRefreshing(false);
}
});
// menambah request ke request queue
AppController.getInstance().addToRequestQueue(jArr);
}
// fungsi untuk menyimpan atau update
private void simpan_update() {
String url;
if (id.isEmpty()) {
url = url_insert;
} else {
url = url_update;
}
StringRequest strReq = new StringRequest(Request.Method.POST, url, new Response.Listener() {
@Override
public void onResponse(String response) {
Log.d(TAG, "Response: " + response.toString());
try {
JSONObject jObj = new JSONObject(response);
success = jObj.getInt(TAG_SUCCESS);
// Cek error node pada json
if (success == 1) {
Log.d("Add/update", jObj.toString());
callVolley();
kosong();
Toast.makeText(MainActivity.this, jObj.getString(TAG_MESSAGE), Toast.LENGTH_LONG).show();
adapter.notifyDataSetChanged();
} else {
Toast.makeText(MainActivity.this, jObj.getString(TAG_MESSAGE), Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
// JSON error
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, "Error: " + error.getMessage());
Toast.makeText(MainActivity.this, error.getMessage(), Toast.LENGTH_LONG).show();
}
})
{
@Override
protected Map getParams() {
// Posting parameters ke post url
Map params = new HashMap();
if (id.isEmpty()) {
params.put("nama", nama);
params.put("tlp", tlp);
params.put("email", email);
} else {
params.put("id", id);
params.put("nama", nama);
params.put("tlp", tlp);
params.put("email", email);
}
return params;
}
};
AppController.getInstance().addToRequestQueue(strReq, tag_json_obj);
}
// fungsi untuk get edit data kontak
private void edit(final String idx) {
StringRequest strReq = new StringRequest(Request.Method.POST, url_edit, new Response.Listener() {
@Override
public void onResponse(String response) {
Log.d(TAG, "Response: " + response.toString());
try {
JSONObject jObj = new JSONObject(response);
success = jObj.getInt(TAG_SUCCESS);
// Cek error pada json
if (success == 1) {
Log.d("get edit data", jObj.toString());
String idx = jObj.getString(TAG_ID);
String namax = jObj.getString(TAG_NAMA);
String tlpx = jObj.getString(TAG_TLP);
String emailx = jObj.getString(TAG_EMAIL);
DialogForm(idx, namax, tlpx, emailx, "UPDATE");
adapter.notifyDataSetChanged();
} else {
Toast.makeText(MainActivity.this, jObj.getString(TAG_MESSAGE), Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
// JSON error
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, "Error: " + error.getMessage());
Toast.makeText(MainActivity.this, error.getMessage(), Toast.LENGTH_LONG).show();
}
}) {
@Override
protected Map getParams() {
// Posting parameters ke post url
Map params = new HashMap();
params.put("id", idx);
return params;
}
};
AppController.getInstance().addToRequestQueue(strReq, tag_json_obj);
}
// fungsi untuk menghapus
private void delete(final String idx) {
StringRequest strReq = new StringRequest(Request.Method.POST, url_delete, new Response.Listener() {
@Override
public void onResponse(String response) {
Log.d(TAG, "Response: " + response.toString());
try {
JSONObject jObj = new JSONObject(response);
success = jObj.getInt(TAG_SUCCESS);
// Cek error pada json
if (success == 1) {
Log.d("delete", jObj.toString());
callVolley();
Toast.makeText(MainActivity.this, jObj.getString(TAG_MESSAGE), Toast.LENGTH_LONG).show();
adapter.notifyDataSetChanged();
} else {
Toast.makeText(MainActivity.this, jObj.getString(TAG_MESSAGE), Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
// JSON error
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, "Error: " + error.getMessage());
Toast.makeText(MainActivity.this, error.getMessage(), Toast.LENGTH_LONG).show();
}
}) {
@Override
protected Map getParams() {
// Posting parameters ke post url
Map params = new HashMap();
params.put("id", idx);
return params;
}
};
AppController.getInstance().addToRequestQueue(strReq, tag_json_obj);
}
}
4. Buat activity_main.xml sebagai layout yang akan menampilkan datanya.
<?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:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="com.azhar.crud.MainActivity">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout>
<include layout="@layout/content_main" />
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
android:src="@drawable/ic_fab_add" />
</android.support.design.widget.CoordinatorLayout>
5. Buat content_main.xml :
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipe_refresh_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ListView
android:id="@+id/list"
android:divider="@color/list_divider"
android:dividerHeight="2dp"
android:listSelector="@drawable/list_row_selector"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</android.support.v4.widget.SwipeRefreshLayout>
</RelativeLayout>
6. Buat form_kontak.xml untuk mengisi data baru dan untuk mengedit data.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin" >
<EditText
android:id="@+id/txt_id"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:drawable/editbox_background_normal"/>
<EditText
android:id="@+id/txt_nama"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:hint="Nama"
android:singleLine="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:drawable/editbox_background_normal"/>
<EditText
android:id="@+id/txt_tlp"
android:layout_marginBottom="10dp"
android:hint="Telp"
android:inputType="textMultiLine"
android:minLines="3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:drawable/editbox_background_normal"/>
<EditText
android:id="@+id/txt_email"
android:layout_marginBottom="10dp"
android:hint="Email"
android:inputType="textMultiLine"
android:minLines="3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:drawable/editbox_background_normal"/>
</LinearLayout>
7. Buat list_row.xml :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:padding="16dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"/>
<TextView
android:id="@+id/nama"
android:layout_marginBottom="5dp"
android:textStyle="bold"
android:text="Nama"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tlp"
android:text="Telp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/email"
android:text="Email"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
8. Buat KontakAdapter.java. Class ini berfungsi sebagai menampilkan data seperti id, nama, tlp dan email kemudian ditampilkan ke dalam ListView.
package com.azhar.crud.adapter;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.azhar.crud.R;
import com.azhar.crud.data.Data;
import java.util.List;
/**
* Created by Azhar Rivaldi on 27/06/2019.
*/
public class KontakAdapter extends BaseAdapter {
private Activity activity;
private LayoutInflater inflater;
private List items;
public KontakAdapter(Activity activity, List items) {
this.activity = activity;
this.items = items;
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int location) {
return items.get(location);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (inflater == null)
inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) convertView = inflater.inflate(R.layout.list_row, null);
TextView id = (TextView) convertView.findViewById(R.id.id);
TextView nama = (TextView) convertView.findViewById(R.id.nama);
TextView tlp = (TextView) convertView.findViewById(R.id.tlp);
TextView email = (TextView) convertView.findViewById(R.id.email);
Data data = items.get(position);
id.setText(data.getId());
nama.setText(data.getNama());
tlp.setText(data.getTlp());
email.setText(data.getEmail());
return convertView;
}
}
9. Buat AppController.java. Class tunggal yang menginisialisasi class global yang diperlukan. Semua objek yang berhubungan dengan library Volley diinisialisasikan di sini.
package com.azhar.crud.app;
import android.app.Application;
import android.text.TextUtils;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;
/**
* Created by Azhar Rivaldi on 27/06/2019.
*/
public class AppController extends Application {
public static final String TAG = AppController.class.getSimpleName();
private RequestQueue mRequestQueue;
private static AppController mInstance;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
}
public static synchronized AppController getInstance() {
return mInstance;
}
public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
mRequestQueue = Volley.newRequestQueue(getApplicationContext());
}
return mRequestQueue;
}
public void addToRequestQueue(Request req, String tag) {
req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
req.setRetryPolicy(new DefaultRetryPolicy(0, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
getRequestQueue().add(req);
}
public void addToRequestQueue(Request req) {
req.setTag(TAG);
req.setRetryPolicy(new DefaultRetryPolicy(0, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
getRequestQueue().add(req);
}
public void cancelPendingRequests(Object tag) {
if (mRequestQueue != null) {
mRequestQueue.cancelAll(tag);
}
}
}
10. Buat Data.java. Class ini berfungsi sebagai membuat objek untuk setiap item yang diparsing JSON. Objek ini berisi informasi seperti id, nama, tlp dan email.
package com.azhar.crud.data;
/**
* Created by Azhar Rivaldi on 27/06/2019.
*/
public class Data {
private String id, nama, tlp, email;
public Data() {
}
public Data(String id, String nama, String tlp, String email) {
this.id = id;
this.nama = nama;
this.tlp = tlp;
this.email = email;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getNama() {
return nama;
}
public void setNama(String nama) {
this.nama = nama;
}
public String getTlp() {
return tlp;
}
public void setTlp(String tlp) {
this.tlp = tlp;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.tlp = email;
}
}
11. Buat Server.java. Class ini berfungsi mengatur link server sumber data dari Web Service yang akan digunakan menggunakan IP Address.
package com.azhar.crud.util;
/**
* Created by Azhar Rivaldi on 27/06/2019.
*/
public class Server {
/* Jika IP 10.0.2.2, itu adalah IP Address localhost EMULATOR ANDROID STUDIO,
Ganti IP Address tersebut dengan IP Laptop Anda. Apabila di RUN di HP. HP dan Laptop harus 1 jaringan */
public static final String URL = "http://192.168.115.114/android/biodata/";
}
Support Blog Rivaldi 48 agar terus bisa membagikan artikel-artikel yang bermanfaat dengan cara klik link Sociabuzz dibawah ini :https://sociabuzz.com/azharrvldi_/donate (bisa pakai GoPay, OVO, DANA, Bank Transfer)
Aplikasi Android CRUD |
Aplikasi Android CRUD |
Aplikasi Android CRUD |
Aplikasi Android CRUD |
Mas ada tutorial buat media pembelajaran gak?
ReplyDeletemedia pembelajaran seperti aa ya?
Deletegit nya gak ada ya bg? heheh
Deletepas saya pasang volley di gradle nya kok error ya?
ada, dibaca artikelnya pelan2 ya
Deletegan saya putih semua, ga konek ke databasenya kayanya? apa yang perlu saya cek, saya sudah samakan ipnya
ReplyDeletegunakan satu jaringan antara laptop dan hpnya gan
DeleteBang, saya ko setelah di run aplikasinya gak bisa jalan, saya bikinnya di Android Studio v3.5.. apakah script nya ada yang harus di ubah?
ReplyDeletecek logcatnya, karena saya gaktau error apa yg anda alami..
Deleteterimakasih ilmunya abang..
ReplyDeletesama sama gan.. bantu share ya
Deletebelum nyoba sih tapi mantaps lah kayaknya tutorialnya,...
ReplyDeletesemoga bermanfaat bagi semua programmer
makasih gan.. bantu share juga ya
Deleteealah baru di coba ternyata salahnya banyak di drawabel sama stringnya
ReplyDeletepelan pelan gan wkwk
Deletehalo, sebelumnya mai ucapin terima kasih karena tutorialnya cukup bisa di mengerti orang awam, mau tanya ini di build pake sdk berapa ya? saya error di impor android.support, kayaknya gara gara migrasi androidx
ReplyDeletelebih baik migrasi ke androidX kak, karena source ini masih android.appcompact. androidX bisa suppourt android P dan sdk 29, sedangkan ini hanya bisa sampe sdk 28
Deletesetelah ikutin tutorial berati di appcompact di migrate terus refactor ya?
Deleteyes, semangat...
ReplyDeletemaaf saya mau tanya untuk Data.java pada bagian :
ReplyDeletepublic Data(String id, String nama, String tlp, String email) {
this.id = id;
this.nama = nama;
this.tlp = tlp;
this.email = email;
}
saya coba berwarna abu2 dan is never used, saat saya running program data tidak tampil "rg.json.JSONException: No value for id"
mohon arahannya pak
coba di debug dibagian mana yang menampilkan datanya
DeleteD/Volley: [372] BasicNetwork.logSlowRequests: HTTP response for request=<[ ] http://10.0.2.2/crud/biodata/select.php 0x1e7db229 NORMAL 1> [lifetime=5629], [size=1053], [rc=404], [retryCount=0]
DeleteE/Volley: [372] BasicNetwork.performRequest: Unexpected response code 404 for http://10.0.2.2/crud/biodata/select.php
D/Volley: [2] 7.onErrorResponse: MainActivity
IP nya sudah diganti dengan IP emulator/laptop agan?
Deletesudah pak... 10.0.2.2
Deletemaaf pak tadi di server.java nya kebablasan nulis kodingnya.
Deletesudah saya perbaiki dan di logcat sudah tampil isi dari data basenya, hanya saja masih error dan tidak tampil di emulator androidnya
D/MainActivity: [{"ID":"1","Nama":"surya","Tlp":"087782786764","Email":"sdarma@yahoo.com"}]
W/System.err: org.json.JSONException: No value for id
W/System.err: at org.json.JSONObject.get(JSONObject.java:392)
at org.json.JSONObject.getString(JSONObject.java:553)
at com.testcrud.MainActivity$6.onResponse(MainActivity.java:229)
at com.testcrud.MainActivity$6.onResponse(MainActivity.java:217)
W/System.err: at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:72)
at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
mohon arahannya pak. terima kasih
biasanya itu karena masalah jaringan atau IP mas :)
Deletetapi jika saya tambah data itu berhasil pak.
Deletejadi saya berfikir mungkin datanya tidak terisi/gagal di Data.java
karena di kode :
public Data(String id, String nama, String tlp, String email) {
this.id = id;
this.nama = nama;
this.tlp = tlp;
this.email = email;
}
nah pada public Data ini warnanya abu2 dan ada keterangan is never used, jadi kemungkinan datanya tidak tertampung.
untuk public Data tesebut digunakan / di panggil dimana nantinya ya pak??
dia di panggil di KontakAdapter & MainActivity seharusnya
Delete
Deletepada $json[] = $row;
apa harus di isi pak misal : $json[Data] = $row;
di KontakAdapter & MainActivity hanya mengarah pada
DeletePublic Data(){
}
nah yg kosong itu pak
sama saya juga mendapatkan run yang belum bisa read data, itu solvednya bagaimana ya kak?
Deletecoba di debug
Deletekalau data ya lebih dari satu tabel gmn ya manggilnya ?
ReplyDeletesaya belum pernah coba, mungkin bisa di join kan
Deletemalam, sy mo tnya, klo pesan error " Emulator: emulator:ERROR:AdbHostServer.cpp:102:unable to connect to adb daemon on port:5037" maksud dri pesan itu apa ya. trimakasih
ReplyDeleteIP emulatornya gak kebaca sama kodingnya
Deletesaya pakai emulator android mas, tapi datanya tidak nampil mas ip addressnya juga sudah saya ubah sesuai ip emulator
ReplyDeleteapakah ini bisa di implementasikan pada xampp versi terbaru ?
Deletebisa gan
Deleteini kenapa ya bang?
ReplyDeletefinal String idx = itemList.get(position).getId();
^
symbol: method getId()
location: class Object
terima kasih bang tutorialnya, udah saya coba tapi ada error di bagian mainactivity java,
ReplyDeleteditempat saya
// fungsi floating action button untuk memanggil form kontak
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DialogForm("", "", "", "", "", "", "", "SIMPAN");
}
});
dialog form merah,
@Override
public void onRefresh() {
itemList.clear();
adapter.notifyDataSetChanged();
callVoley();
callVolley juga merah,
// untuk menampilkan dialog form kontak
private void DialogForm(String idx, String namax, String alamatx, String longitudex,
String latitudex, String no_hpx, String uangx, String paguyubanx, String penyalurx,
String ambilx, String statusx,
String button) {
pas di dialog form dideklarasikan jadi merah,
bagian ini juga merah
if (!idx.isEmpty()) {
txt_id.setText(idx);
txt_nama_mustahik.setText(namax);
txt_alamat.setText(alamatx);
txt_longitude.setText(longitudex);
txt_latitude.setText(latitudex);
txt_no_hp.setText(no_hpx);
txt_uang.setText(uangx);
txt_paguyuban.setText(paguyubanx);
txt_penyalur.setText(penyalurx);
txt_ambil.setText(ambilx);
txt_status.setText(statusx);
} else {
kosong();
}
dialog.setPositiveButton(button, new DialogInterface.OnClickListener() {
kira-kira solusinya bagaimana ya bang? terima kasih
udah di import library dialognya? atau coba restart android studonya
Deleteudah import DialogInterface tapi masih merah, terus di bagian import adapter, data sama server tulisannya ga nyala/masih abu2...
Deleteketika di rebuild dibagian res/value ada error
Solusinya gimana ya bang? makasih bang
bang maaf mau tanya
Deletefinal String idx = itemList.get(position).getId();
getId mengacu pada apa ya bang? terima kasih ..
bang maaf banyak tanya, saya sedang build aplikasi pakai tutorial punya abang...
ReplyDeletemau tanya, ketika response.listener di implement munculnya
@Override
public void onResponse(Object response) {
punya abang
@Override
public void onResponse(JSONArray response) {
apakah itu berbeda bang? biar jadi JSONArray gimana ya bang? makasih bang
bang mau tanya lagi, maaf banget kalo spam
Delete// fungsi untuk menghapus
private void delete(final String idx) {
StringRequest strReq = new StringRequest(Request.Method.POST, url_delete, new Response.Listener() {
Response.Listener kalau di implemen bukan String response tapi Object respons... mohon pencerahannya, terima kasih
Bagaimana ya bang? mohon pencerahannya
ReplyDeleteTerima kasih
saya bingung mau bales yg mana wkwk
Deleteitu kalo di input data bisa ke record mas datanya ? maksudnya ada record data di excel / spreedsheet ngga
ReplyDeleteharus ada library tambahan
DeleteInputnya ditambah satu field upload dokumen atau gambar mas
ReplyDeletemaksudnya?
Deleteperintah untuk login gimana
ReplyDeletesama aja, tinggal dibuat tabel tambahan untuk simpan data login
Delete