-
[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 버튼을 누르면 , 데이터가 삭제된 것을 볼 수 있습니다.
이렇게 메모 앱의 기본 기능인 데이터 생성, 수정, 삭제 기능을 모두 구현했습니다! 다음 시간에는 원하는 메모를 알림창에 띄우는 기능을 구현 해 보겠습니다.
'Android' 카테고리의 다른 글
[Android] 메모장 앱 만들기(2)_Realm DB에 데이터 추가하기 (0) 2020.04.24 [Android] 메모장 앱 만들기(1)_Realm DB 연동하기 (0) 2020.04.23 [Android] 현재위치 GPS정보 받기( + Firebase 연결) (1) 2019.10.24 [Android] UUID로 Miband2 정보 가져오기 (0) 2018.11.23 [Android] Wifi정보 출력 (0) 2018.11.23