Sebelum sistem android dapat menjalankan aplikasi Menu Delete ini, sistem terlebih dahulu harus tahu bahwa komponen aplikasi memang ada, yakni dengan cara membaca file "AndroidManifest.xml". Pada file manifest dideklarasikan komponen aplikasi. Misalnya untuk contoh menu ini dibutuhkan perijinan akses internet untuk dapat melakukan koneksi ke database yang tersimpan pada localhost dari emulator dengan alamat "http://10.0.2.2". Dimana pada localhost inilah file "getUser.php", "deleteUser.php", dan "connect_db.php" tersimpan.
Jadi, pertama kali pastikan Anda telah update isi file "AndroidManifest.xml" sebagai berikut.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.contoh"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
//untuk koneksi internet
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.contoh.DeleteActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Berdasarkan "android.intent.category.LAUNCHER" pada file manifest, class "DeleteActivity.java" lah yang akan diakses pertama kali ketika sistem dijalankan. Berikut soruce code untuk "DeleteActivity.java" yang tersimpan pada folder "src" dari struktur direktori android.
package com.example.contoh;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.Html;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class DeleteActivity extends Activity implements OnItemClickListener{
private final String urlDisplay = "http://10.0.2.2/contoh/getUser.php"; //koneksi database ke localhost
private final String urlDelete = "http://10.0.2.2/contoh/deleteUser.php"; //koneksi database ke localhost
private UserAdapter adapter;
private ListView listUser;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display);
adapter = new UserAdapter(this, R.id.textView1);
loadDataUser();
listUser = (ListView) findViewById(R.id.listViewUser);
listUser.setAdapter(adapter);
listUser.setOnItemClickListener(this);
}
private void loadDataUser(){
try { String jsonString = DisplayActivity.getRequestFromServer(urlDisplay);
JSONObject jObject = new JSONObject(jsonString);
JSONArray newsJsonArray = jObject.getJSONArray("user");
for (int i = 0; i < newsJsonArray.length(); i++) {
User user = new User(newsJsonArray.getJSONObject(i));
adapter.add(user);
}
adapter.notifyDataSetChanged();
} catch (Exception e) {
e.printStackTrace();
}
}
class UserAdapter extends ArrayAdapter<User>{
public UserAdapter(Context context, int resource) {
super(context, resource);
}
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView==null){
convertView = ((LayoutInflater)getSystemService(Activity.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.activity_adapter, parent,false);
}
TextView usernameUser = (TextView) convertView.findViewById(R.id.textViewUsername);
TextView passwordUser = (TextView) convertView.findViewById(R.id.textViewPassword);
User entityUser = getItem(position);
usernameUser.setText(entityUser.username);
passwordUser.setText(entityUser.password);
return convertView;
}
}
public void onItemClick(AdapterView<?> adapterV, View view, int position, long id) {
try { String url = DeleteActivity.getRequestFromServer(urlDelete+"?username="+adapter.getItem(position).username); Toast.makeText(this, url, Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(this, "Error: "+ e.getMessage(), Toast.LENGTH_LONG).show();
}
startActivity(new Intent(this, DeleteActivity.class));
finish();
}
public static String getRequestFromServer(String url){
try {
Class<?> strictModeClass = Class.forName("android.os.StrictMode", true, Thread.currentThread()
.getContextClassLoader());
Class<?> threadPolicyClass = Class.forName("android.os.StrictMode$ThreadPolicy", true, Thread
.currentThread().getContextClassLoader());
Class<?> threadPolicyBuilderClass = Class.forName("android.os.StrictMode$ThreadPolicy$Builder", true,
Thread.currentThread().getContextClassLoader());
Method setThreadPolicyMethod = strictModeClass.getMethod("setThreadPolicy", threadPolicyClass);
Method detectAllMethod = threadPolicyBuilderClass.getMethod("detectAll");
Method penaltyMethod = threadPolicyBuilderClass.getMethod("penaltyLog");
Method buildMethod = threadPolicyBuilderClass.getMethod("build");
Constructor<?> threadPolicyBuilderConstructor = threadPolicyBuilderClass.getConstructor();
Object threadPolicyBuilderObject = threadPolicyBuilderConstructor.newInstance();
Object obj = detectAllMethod.invoke(threadPolicyBuilderObject);
obj = penaltyMethod.invoke(obj);
Object threadPolicyObject = buildMethod.invoke(obj);
setThreadPolicyMethod.invoke(strictModeClass, threadPolicyObject);
} catch (Exception ex) {
Log.w("Thread Policy", ex);
}
String result = "Succeed";
HttpClient client = new DefaultHttpClient();
HttpClientParams.setRedirecting(client.getParams(), true);
HttpGet request = new HttpGet(url);
try{
HttpResponse response = client.execute(request);
InputStream in = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder str = new StringBuilder();
String line = null;
int lineCount = 0;
while((line = reader.readLine()) != null){
if(lineCount>0) str.append("\n");
str.append(line);
}
in.close();
result = str.toString();
Log.w("get Request", "asli : "+result);
if(result.indexOf("<") > 0){
result = result.substring(0, result.indexOf("<"));
}
Log.w("get Request", "proses : "+Html.fromHtml(result));
return Html.fromHtml(result).toString();
}catch(Exception ex){
ex.printStackTrace();
result = "Error";
}
return result;
}
}
Logika Menu Delete ini adalah data username dan password akan ditampilkan lebih dulu. Kemudian sistem akan melakukan penghapusan data berdasarkan aksi sentuh yang dilakukan oleh user ke salah satu record dari data yang tampil pada layar. Penjelasan source code mengenai bagaimana sistem menampilkan data tersebut, silakan lihat penjelasan posting Contoh Menu Display (Client-Server Android).
Perhatikan bagian listUser.setOnItemClickListener(this), inilah source code untuk menjalankan aksi penghapusan ketika user klik salah satu record. Selanjutnya sistem akan memanggil fungsi public void onItemClick(AdapterView<?> adapterV, View view, int position, long id) dan akan melakukan query penghapusan salah satu record di database berdasarkan nama username, urlDelete+"?username="+adapter.getItem(position).username. Berikut query untuk aksi delete ini yang tersimpan pada file "deleteUser.php".
<?php
$username = $_GET['username'];
include "connect_db.php";
$query = "delete from tbuser where username ='".$username."'";
$result = mysql_query($query, $link) or die('Error query: '.$query);
echo $result;
?>
Setelah aksi salah satu record terhapus, sistem akan melakukan refresh melalui startActivity(new Intent(this, DeleteActivity.class)).
Silakan lihat posting "Contoh Aplikasi Client-Server Android" pada blog ini untuk mengetahui langkah detail bagaimana membuat projek baru Android menggunakan eclipse untuk Menu Delete ini.
Tidak ada komentar:
Posting Komentar