프로그래밍/안드로이드

안드로이드 - 프로젝트7. 회원 삭제 및 관리자 기능

가카리 2018. 4. 9. 22:19
반응형


이전예제 


이번에는 저번 강의때 했던 회원목록을 출력후 회원 삭제 기능을 추가하는 예제입니다.

  1. 먼저 관리자 계정인 admin 계정으로 로그인을 합니다.





  1. 그 다음 MANAGE 버튼을 눌러 관리자페이지로 들어갑니다.



  1. 다음과 같이 현재 계정리스트를 출력하고 바로 옆에 삭제 버튼이 있습니다. 삭제 버튼을 누르면



  1. 해당 계정은 삭제하게 됩니다.



  1. 실제 데이터베이스를 봐도 admin계정을 제외하고 gakari1계정만 남아있는 것을 볼 수 있습니다.



예제 

  1. 먼저 다음의 레이아웃을 만들기 위해 user.xml 파일을 수정합시다.




user.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:paddingTop="5dp"
    android:paddingBottom="5dp"
    android:background="#ffffff"
    >
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:gravity="center"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:paddingTop="5dp"
        android:paddingBottom="5dp"
        >
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="삭제"
            android:background="#00a7f5"
            android:textColor="#fff"
            android:textSize="18dp"
            android:id="@+id/deleteButton"
            />
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:paddingTop="5dp"
        android:paddingBottom="5dp"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/userID"
            android:text="ID"
            android:textSize="20dp"
            android:textColor="#00a7f5"
            />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/userPassword"
            android:text="PASSWORD"
            android:textSize="20dp"
            android:textColor="#f92a3f"
            />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/userName"
            android:text="NAME"
            android:textSize="16dp"
            android:textColor="#a902f0"
            />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/userAge"
            android:text="AGE"
            android:textSize="18dp"
            android:textColor="#00a7f5"
            />
    </LinearLayout>
</LinearLayout>

  1. 다음과 같이  Volley라이브러리를 사용하기 위해 StringRequest를 상속받아 POST방식으로 값을 넘겨줄 URL과 변수들을 설정합니다.

package com.example.kch.proj_manager_v7;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.toolbox.StringRequest;
import java.util.HashMap;
import java.util.Map;
/**
 * Created by kch on 2018. 4. 8..
 */
public class DeleteRequest extends StringRequest{
    //현재 안드로이드앱을 에뮬레이터로 돌리므로 에뮬레이터가 설치된 서버에 있는 아파치 서버에 접근하려면
    //다음과 같이 10.0.2.2:포트번호 접근해야합니다 저는 8080 포트를 써서 다음과 같이 했습니다
    final static private String URL = "http://10.0.2.2:8080/Delete.php";
    private Map<String, String> parameters;
    public DeleteRequest(String userID, Response.Listener<String> listener){
        super(Request.Method.POST, URL, listener, null);//Post방식임
        parameters = new HashMap<>();//해쉬맵 생성후 parameters 변수에 값을 넣어줌
        parameters.put("userID", userID);
    }
    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        return parameters;
    }
}

  1. 위 실행화면에서 각 리스트뷰에 버튼을 추가했는데 그 버튼을 선언 후 리스너를 등록해줍니다. 이때 버튼이 눌리면 PHP서버로 넘겨줄 데이터를 설정해줍니다.


package com.example.kch.proj_manager_v7;
import android.app.Activity;
import android.content.Context;
import android.support.v7.app.AlertDialog;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.toolbox.Volley;
import org.json.JSONObject;
import java.util.List;
/**
 * Created by kch on 2018. 2. 17..
 */
public class UserListAdapter extends BaseAdapter {
    private Context context;
    private List<User> userList;
    private Activity parentActivity;//회원삭제 강의때 추가
    //여기서 Actvitivy parentActivity 추가됨 회원삭제 관리자기능 예제
    public UserListAdapter(Context context, List<User> userList, Activity parentActivity){
        this.context = context;
        this.userList = userList;
        this.parentActivity = parentActivity;//회원삭제 강의때 추가
    }
    //출력할 총갯수를 설정하는 메소드
    @Override
    public int getCount() {
        return userList.size();
    }
    //특정한 유저를 반환하는 메소드
    @Override
    public Object getItem(int i) {
        return userList.get(i);
    }
    //아이템별 아이디를 반환하는 메소드
    @Override
    public long getItemId(int i) {
        return i;
    }
    //가장 중요한 부분
    //int i 에서 final int i 바뀜 이유는 deleteButton.setOnClickListener에서 값을 참조하기 때문
    @Override
    public View getView(final int i, View view, ViewGroup viewGroup) {
        View v = View.inflate(context, R.layout.user, null);
        //뷰에 다음 컴포넌트들을 연결시켜줌
        //final추가 안붙이면 에러남 리스너로 전달하고 싶은 지역변수는 final 처리해야됨
        final TextView userID = (TextView)v.findViewById(R.id.userID);
        TextView userPassword = (TextView)v.findViewById(R.id.userPassword);
        TextView userName = (TextView)v.findViewById(R.id.userName);
        TextView userAge = (TextView)v.findViewById(R.id.userAge);
        userID.setText(userList.get(i).getUserID());
        userPassword.setText(userList.get(i).getUserPassword());
        userName.setText(userList.get(i).getUserName());
        userAge.setText(userList.get(i).getUserAge());
        //이렇게하면 findViewWithTag 있음 없어도 되는 문장임
        v.setTag(userList.get(i).getUserID());
        //삭제 버튼 객체 생성
        Button deleteButton = (Button)v.findViewById(R.id.deleteButton);
        deleteButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                //4. 콜백 처리부분(volley 사용을 위한 ResponseListener 구현 부분)
                Response.Listener<String> responseListener = new Response.Listener<String>(){
                    @Override
                    public void onResponse(String response) {
                        try{
                            JSONObject jsonResponse = new JSONObject(response);
                            boolean success = jsonResponse.getBoolean("success");
                            //받아온 값이 success 정상적으로 서버로부터 값을 받은 것을 의미함
                            if(success){
                                userList.remove(i);//리스트에서 해당부분을 지워줌
                                notifyDataSetChanged();//데이터가 변경된 것을 어댑터에 알려줌
                            }
                        }
                        catch(Exception e){
                            e.printStackTrace();
                        }
                    }
                };
                //volley 사용법
                //1. RequestObject 생성한다. 이때 서버로부터 데이터를 받을 responseListener 반드시 넘겨준다.
                //위에서 userID final 선언해서 아래 처럼 가능함
                DeleteRequest deleteRequest = new DeleteRequest(userID.getText().toString(), responseListener);
                //2. RequestQueue 생성한다.
                //여기서 UserListAdapter Activity에서 상속받은 클래스가 아니므로 Activity값을 생성자로 받아서 사용한다
                RequestQueue queue = Volley.newRequestQueue(parentActivity);
                //3. RequestQueue RequestObject 넘겨준다.
                queue.add(deleteRequest);
            }//onclick
        });
        //만든뷰를 반환함
        return v;
    }
}

  1. 마지막으로 PHP 서버에서 Delete.php를 만들어줍시다.
<?php
    $con = mysqli_connect('localhost', 'root', 'qwer1234', 'proj_manager');
     $userID = $_POST["userID"];
     $statement = mysqli_prepare($con, "DELETE FROM USER WHERE userID = ?");
     mysqli_stmt_bind_param($statement, "s", $userID);
     mysqli_stmt_execute($statement);
     //배열 선언
     $response = array();
     //success true라는 값을 넣어줌
     $response["success"] = true;
     echo json_encode($response);
?>