ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android] 메모장 앱 만들기(3)_Realm DB 데이터 수정 및 삭제
    Android 2020. 4. 28. 13:40

    저번에는 데이터를 추가해서 리스트로 보여주는 동작을 구형했습니다. 이번에는 데이터를 수정하고 ,삭제하는 기능을 추가할 예정입니다.

    recyclerview에 보여지는 데이터를 클릭하여 해당 수정 페이지로 들어가게 구현 하려합니다. 먼저, 수정 페이지를 만들어줍니다.

    1) 수정 페이지 만들기 : memo_modify.xml 

    아이템을 클릭했을 때, 보여지는 수정페이지의 레이아웃 입니다. 전에 만들어 둔 memo_write.xml의 내용을 복붙합니다.

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        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:orientation="vertical"
        tools:context=".MainActivity">
        <include
            android:id="@+id/toolbarInclude"
            layout="@layout/toolbar"
            android:layout_width="match_parent"
            android:layout_height="55dp" />
        <TextView
            android:id="@+id/date"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="18.00sp"
            android:textStyle="bold"
            android:layout_marginTop="20dp"
            android:layout_marginLeft="10dp"
            tools:text="오늘날짜 : 2019/01/01" />
    
        <TextView
            android:id="@+id/event"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:textSize="18.00sp"
            android:ems="10"
            android:textStyle="bold"
            android:layout_marginLeft="10dp"
            tools:text="제목" />
    
        <EditText
            android:id="@+id/title"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="10.00dp"
            android:hint="제목을 입력하세요"
            android:inputType="textCapWords"
            android:padding="10dp"
            android:textColor="#000000"
            tools:ignore="MissingConstraints" />
        <TextView
            android:id="@+id/event1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:textSize="18.00sp"
            android:textStyle="bold"
            android:layout_marginLeft="10dp"
            tools:text="내용" />
    
        <EditText
            android:id="@+id/content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="10.00dp"
            android:hint="내용을 입력하세요"
            android:padding="10dp"
            android:gravity="start"
            android:textColor="#000000" />
    </LinearLayout>

    2) MemoAdapter 수정

    MemoAdapter에서 리싸이클 뷰에 접근하는 방법은 ViewHolder를 통해 각 아이템의 위치에 해당하는 데이터를 가져올 수 있습니다. ViewHolder클래스 안의 코드를 수정해줍니다. 

       class ViewHolder extends RecyclerView.ViewHolder {
            TextView mtitle, mdate, mcontent;
            public ViewHolder(final View itemView) {
                super(itemView);
                mtitle = itemView.findViewById(R.id.mtitle);
                mdate = itemView.findViewById(R.id.mdate);
                mcontent = itemView.findViewById(R.id.mcontent);
                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        final Context context = itemView.getContext();
                        Bundle bundle = new Bundle();
                        bundle.putInt("id", getAdapterPosition());
                        Intent mainIntent = new Intent(context, MemoModify.class);
                        mainIntent.putExtras(bundle);
                        mainIntent.putExtra("title", memoList.get(getAdapterPosition()).getTitle());
                        mainIntent.putExtra("date", memoList.get(getAdapterPosition()).getDate());
                        mainIntent.putExtra("content", memoList.get(getAdapterPosition()).getContent());
                        mainIntent.putExtra("itemnum", getAdapterPosition());
                        context.startActivity(mainIntent);
                    }
                });
            }
        }

    intent를 통해 각 item의 위치 별 데이터를 수정페이지인 MemoModify로 넘겨줍니다. getAdapterPosition은 위치를 반환해 줍니다.

    그리고, 아이템 클릭 시 저장된 데이터와 함께 해당 수정 페이지로 넘어가게 해줍니다.

      Intent intent = getIntent();
            titles = intent.getStringExtra("title");
            dates = intent.getStringExtra("date");
            contents = intent.getStringExtra("content");
            itemnums = intent.getIntExtra("itemnum",1);

    >> 데이터를 받아오는 동작

    3) 수정 및 삭제 동작생성

    menu > memo_modify.xml 하위 메뉴를 생성합니다. (버튼추가)  //이전 게시글에서 했던 방법으로 추가

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
        <item
            android:id="@+id/action_mod"
            android:title="edit"
            app:showAsAction="ifRoom"/>
        <item
            android:id="@+id/action_del"
            android:title="delete"
            app:showAsAction="ifRoom"/>
    </menu>

    ex) 예시화면

    MemoModify.java에 메뉴 동작을 추가해 줍니다. realmDB의 수정과 삭제 동작을 각각 넣어줍니다.

     @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.memo_modify, menu);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
    
            int id = item.getItemId();
            // 앱 정보 나타내기
            if (id == R.id.action_mod) {
                realm = Realm.getDefaultInstance();
                realm.executeTransaction(new Realm.Transaction() {
                    @Override
                    public void execute(Realm realm) {
                        final Memo results = realm.where(Memo.class).equalTo("title",titles).findFirst();
                        results.setTitle(mtitle.getText().toString());
                        results.setDate(date.getText().toString());
                        results.setContent(mcontent.getText().toString());
                        Toast.makeText(getApplicationContext(), mtitle + " 수정완료", Toast.LENGTH_SHORT).show();
                    }
                });
                realm.close();
                Intent mod = new Intent(MemoModify.this, MainActivity.class);
                startActivityForResult(mod, 1);
            }else if(id == R.id.action_del){
                realm = Realm.getDefaultInstance();
                realm.executeTransaction(new Realm.Transaction() {
                    @Override
                    public void execute(Realm realm) {
                        final Memo results = realm.where(Memo.class).equalTo("title",titles).findFirst();
                        if(results.isValid()){
                            results.deleteFromRealm();
                        }
                        Toast.makeText(getApplicationContext()," delete complete",Toast.LENGTH_SHORT).show();
                    }
                });
                realm.close();
            }
            return super.onOptionsItemSelected(item);
        }

     

    MemoModify.java 전체코드

    package com.example.myapplication;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.EditText;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.appcompat.widget.Toolbar;
    
    import io.realm.Realm;
    
    public class MemoModify  extends AppCompatActivity{
        String titles, dates, contents;
        int itemnums;
        TextView date;
        EditText mtitle, mcontent;
        Realm realm;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.memo_modify);
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
    
            Intent intent = getIntent();
            titles = intent.getStringExtra("title");
            dates = intent.getStringExtra("date");
            contents = intent.getStringExtra("content");
            itemnums = intent.getIntExtra("itemnum",1);
    
            date = findViewById(R.id.date);
            mtitle = findViewById(R.id.title);
            mcontent = findViewById(R.id.content);
    
            date.setText(dates);
            mtitle.setText(titles);
            mcontent.setText(contents);
    
        }
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.memo_modify, menu);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
    
            int id = item.getItemId();
            // 앱 정보 나타내기
            if (id == R.id.action_mod) {
                realm = Realm.getDefaultInstance();
                realm.executeTransaction(new Realm.Transaction() {
                    @Override
                    public void execute(Realm realm) {
                        final Memo results = realm.where(Memo.class).equalTo("title",titles).findFirst();
                        results.setTitle(mtitle.getText().toString());
                        results.setDate(date.getText().toString());
                        results.setContent(mcontent.getText().toString());
                        Toast.makeText(getApplicationContext(), " 수정완료", Toast.LENGTH_SHORT).show();
                    }
                });
                realm.close();
                Intent mod = new Intent(MemoModify.this, MainActivity.class);
                startActivityForResult(mod, 1);
                finish();
            }else if(id == R.id.action_del){
                realm = Realm.getDefaultInstance();
                realm.executeTransaction(new Realm.Transaction() {
                    @Override
                    public void execute(Realm realm) {
                        final Memo results = realm.where(Memo.class).equalTo("title",titles).findFirst();
                        if(results.isValid()){
                            results.deleteFromRealm();
                        }
                        Toast.makeText(getApplicationContext()," delete complete",Toast.LENGTH_SHORT).show();
                    }
                });
                realm.close();
                Intent mod = new Intent(MemoModify.this, MainActivity.class);
                startActivityForResult(mod,1);
                finish();
            }
            return super.onOptionsItemSelected(item);
        }
    
    }
    

     

    4) 실행화면

    이제, 제대로 동작하는지 봅니다.

    먼저, 메인 화면에서 메모 하나를 추가합니다.

    그리고 저장 버튼으로 리스트에 들어가는지 확인합니다.

    추가했던 메모를 클릭하면, 해당 메모글 정보를 그대로 가져옵니다.

    메모를 수정하고, edit버튼을 눌러 적용시킵니다.

    메모가 수정되어 들어간 것을 확인 할 수 있습니다!!

    다시 들어가서 delete 버튼을 누르면 , 데이터가 삭제된 것을 볼 수 있습니다.

     

    이렇게 메모 앱의 기본 기능인 데이터 생성, 수정, 삭제 기능을 모두 구현했습니다! 다음 시간에는 원하는 메모를 알림창에 띄우는 기능을 구현 해 보겠습니다.

Designed by Tistory.