상세 컨텐츠

본문 제목

[안드로이드] Database Room 사용법 part4 - 수정

안드로이드

by aries574 2022. 5. 17. 13:00

본문


이번 시간에는 리스트에 있는 사용자를

선택하면 수정 화면으로 이동하여 사용자

정보를 변경하는 방법을 알아보겠습니다. 

이전 포스팅은 아래 링크를 들어가시면 됩니다. 

2022.05.16 - [안드로이드] - [안드로이드] Database Room 사용법 part3 - 리스트

 

[안드로이드] Database Room 사용법 part3 - 리스트

 이번 시간에는 등록한 사용자를 리스트로 보여주는 방법에 대하여 알아보겠습니다.  이전 포스팅은 아래 링크를 들어가시면 됩니다. 2022.05.15 - [안드로이드] - [안드로이드] Database Room 사용법 p

aries574.tistory.com


목차

1. 실행 화면
2. 액티비티 설정
3. 수정화면 만들기
4. 아이템 어뎁터 수정
5. 메인 코드 수정 MainActivity.java


1. 실행 화면


2. 액티비티 설정

 - 설명 - 

 액티비티 중복 생성 방지

android:launchMode="singleTask"

AndroidManifest.xml

 <activity
     android:name=".MainActivity"
     android:exported="true"
     android:launchMode="singleTask"
 >


3. 수정화면 만들기

app 선택 -> 마우스 오른쪽 클릭 -> New -> Activity -> Empty Activity

 액티비티 이름: UpdateActivity

 activity_update.xml

 - 설명 -

 1. 리스트에서 선택한 데이터를 EditText에 보여준다. 

 2. 사용자 정보를 수정하고 Button을 누르면 수정된다. 

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".UpdateActivity">

    <EditText
        android:id="@+id/up_name_edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="이름"
        android:inputType="text" />

    <EditText
        android:id="@+id/up_age_edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/up_name_edit"
        android:hint="나이"
        android:inputType="number" />

    <Button
        android:id="@+id/update_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/up_age_edit"
        android:layout_centerHorizontal="true"
        android:text="수정" />
</RelativeLayout>

 

 

UpdateActivity.java

 - 설명 - 

 1. 아이템 어뎁터에서 넘어온 데이터를 변수에 담아 화면에 보여준다. 

 2. 입력한 데이터를 변수에 담아 DB를 통해 수정한다.

public class UpdateActivity extends AppCompatActivity {

    EditText upNameEdit, upAgeEdit;

    int uId;

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

        //초기화
        upNameEdit = findViewById(R.id.up_name_edit);
        upAgeEdit = findViewById(R.id.up_age_edit);
        Button updateBtn = findViewById(R.id.update_btn);

        //아이템 어뎁터에서 넘어온 데이터 변수에 담기
        String name = getIntent().getStringExtra("userName");
        String age = getIntent().getStringExtra("userAge");
        uId = getIntent().getIntExtra("uId", 0);

        //변수 화면에 보여주기
        upNameEdit.setText(name);
        upAgeEdit.setText(age);

        //수정버튼 이벤트
        updateBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //입력값 변수에 담기
                String userName = upNameEdit.getText().toString();
                String userAge = upAgeEdit.getText().toString();

                //사용자 클래스 생성
                User user = new User();
                user.uid = uId;
                user.userName = userName;
                user.userAge = userAge;

                //DB생성
                AppDatabase db = AppDatabase.getDBInstance(UpdateActivity.this);

                //데이터 수정
                db.userDao().userUpdate(user);

                //메인 화면으로 이동
                Intent intent = new Intent(UpdateActivity.this, MainActivity.class);
                startActivity(intent);

                //UpdateActivity 액티비티 종료
                finish();
            }
        });
    }
}


4. 아이템 어뎁터 수정

 - 추가 -

  수정화면(UpdateActivity)를 호출하기 위해 필요한 변수를 추가

    Context context;

    public UserAdapter(Context context) {
        this.context = context;
    }

 - 추가 

 1. mPosition 위치 변수 추가

 2. holder.itemView.setOnClickListener

 클릭 이벤트 추가

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {

        int mPosition = holder.getAdapterPosition();

        holder.nameText.setText(userList.get(mPosition).userName);
        holder.ageText.setText(userList.get(mPosition).userAge);

        //수정화면으로 이동
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent intent = new Intent(context, UpdateActivity.class);
                intent.putExtra("uId", userList.get(mPosition).uid);
                intent.putExtra("userName", userList.get(mPosition).userName);
                intent.putExtra("userAge", userList.get(mPosition).userAge);
                context.startActivity(intent);
            }
        });
    }

  - 추가 -

notifyDataSetChanged();

데이터셋 변경하는 코드 추가 

    public void setUserList(List<User> userList){

        this.userList = userList;
        notifyDataSetChanged();
    }

 

- 전체 코드 -

public class UserAdapter extends RecyclerView.Adapter<UserAdapter.MyViewHolder>{

    List<User> userList;

    Context context;

    public UserAdapter(Context context) {
        this.context = context;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        LayoutInflater inflater = LayoutInflater.from(parent.getContext());

        View view = inflater.inflate(R.layout.list_item, parent, false);

        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {

        int mPosition = holder.getAdapterPosition();

        holder.nameText.setText(userList.get(mPosition).userName);
        holder.ageText.setText(userList.get(mPosition).userAge);

        //수정화면으로 이동
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent intent = new Intent(context, UpdateActivity.class);
                intent.putExtra("uId", userList.get(mPosition).uid);
                intent.putExtra("userName", userList.get(mPosition).userName);
                intent.putExtra("userAge", userList.get(mPosition).userAge);
                context.startActivity(intent);
            }
        });
    }

    @Override
    public int getItemCount() {
        return this.userList.size();
    }

    //리스트 저장
    public void setUserList(List<User> userList){

        this.userList = userList;
        notifyDataSetChanged();
    }

    class MyViewHolder extends RecyclerView.ViewHolder{

        TextView nameText, ageText;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);

            nameText = itemView.findViewById(R.id.name_text);
            ageText = itemView.findViewById(R.id.age_text);
        }
    }
}

 


5. 메인 코드 수정 MainActivity.java

 - 추가 -

수정화면에서 메인화면 호출 시 실행

액티비티 중복 생성 방지하는 코드를

추가했기 때문에 OnCreate대신 실행된다. 

    //액티비티 백그라운드에 있는데 호출되면 실행됨
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        //사용자 조회
        loadUserList();
    }

 - 추가 -

 사용자어뎁터 생성자에 메인 액티비티를 넘겨준다. 

        //UserAdapter 초기화
        adapter = new UserAdapter(MainActivity.this);

 

 - 전체 코드 - 

public class MainActivity extends AppCompatActivity {

    UserAdapter adapter;

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

        FloatingActionButton fab = findViewById(R.id.insertBtn);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent intent = new Intent(MainActivity.this, InsertUserActivity.class);
                activityResult.launch(intent);
            }
        });

        //RecyclerView 초기화 및 설정
        RecyclerView recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        //UserAdapter 초기화
        adapter = new UserAdapter(MainActivity.this);

        //RecyclerView Adapter 설정
        recyclerView.setAdapter(adapter);

        //사용자 조회
        loadUserList();
    }

    //액티비티 백그라운드에 있는데 호출되면 실행
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);

        //사용자 조회
        loadUserList();
    }

    ActivityResultLauncher<Intent> activityResult = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            new ActivityResultCallback<ActivityResult>() {
                @Override
                public void onActivityResult(ActivityResult result) {

                    if(result.getResultCode() == RESULT_OK){

                        //사용자 조회
                        loadUserList();
                    }
                }
            }
    );

    //사용자 조회
    private void loadUserList() {

        AppDatabase db = AppDatabase.getDBInstance(this.getApplicationContext());

        List<User> userList = db.userDao().getAllUser();

        //리스트 저장
       adapter.setUserList(userList);
    }
}

2022.05.07 - [안드로이드] - [안드로이드] HTTP 통신 Volley 사용법 part1 - 간단한 요청 및 응답

 

[안드로이드] HTTP 통신 Volley 사용법 part1 - 간단한 요청 및 응답

이번 시간에는 HTTP통신을 쉽게 도와주는 Volley 라이브러리를 이용해서 API 호출,  데이터를 가져오는 방법에 대하여 알아보겠습니다. 목차 1. 실행 화면 2. 권한 등록 3. 라이브러리 등록 4. 메인

aries574.tistory.com

2022.04.19 - [안드로이드] - [안드로이드] 커스텀 달력 만드는 방법 part1 화면 구성

 

[안드로이드] 커스텀 달력 만드는 방법 part1 화면 구성

이번 시간부터 커스텀 달력을 만들어 보겠습니다. 이번에는 메인화면 구성을 해보겠습니다. 목차 1. 실행 화면 2. 메인 화면 구성 activity_main.xml 1. 실행 화면 2. 메인 화면 구성 activity_main.xml  -.

aries574.tistory.com

2022.03.09 - [안드로이드] - [안드로이드] Firebase 시작하기 실시간 데이터베이스 Realtime Database (간단한 데이터 읽기, 쓰기) part1

 

[안드로이드] Firebase 시작하기 실시간 데이터베이스 Realtime Database (간단한 데이터 읽기, 쓰기) part

이번 시간에는 Firebase를 통해 데이터베이스에 간단한 데이터를 쓰고 읽는 방법에 대하여 알아보겠습니다. 목차 1. 실행 화면 2. 프로젝트 만들기 3. 앱 만들기 4. 데이터 베이스 만들기 5. 라이브러

aries574.tistory.com

 

 

반응형

관련글 더보기

댓글 영역