Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

운기의 블로그

#6. 나만의 메모장 만들기 메모 클릭 시 작성된 메모 보기 / 메모 수정 / 메모 ROOM UPDATE / JAVA로 구현 본문

안드로이드

#6. 나만의 메모장 만들기 메모 클릭 시 작성된 메모 보기 / 메모 수정 / 메모 ROOM UPDATE / JAVA로 구현

운띠야 2020. 4. 7. 02:03

 

저번에는 리사이클러뷰 어댑터에서 롱 클릭 리스너를 이용했다면 이번에는 onBind에서 setOnClickListener을 사용해서 작성된 메모를 누르면 DetailActivity로 넘어가서 작성된 메모 내용을 볼 수 있게 할 겁니다. 

 

메모를 보고 나서, 수정하고 싶으며 바로 로컬 DB에 내용을 변경해서 리사이클러 뷰에 띄우는거 까지 하겠습니다.


 

1. 클래스

 

메모 세부 내용을 보기 위해서 DetailActivity 를 추가 해 줬습니다. 

해당하는 xml 파일까지 작성한 모습입니다. 

 

xml 파일은 git을 참고해주세요.


 

2. RecyclerAdapter 

 

메모 아이템을 삭제한것과 마찬가지로 리사이클러뷰 어댑터 onBind 에서 이벤트를 같이 바인딩해줘 

아이템을 클릭하게 되면 DetailActivity로 넘어가게 됩니다.

이때 넘겨주는 데이터는 클릭된 메모 객체이고 intent를 사용하여 넘겨줍니다.

 

 

3. DetailActivity

 

detail 객체를 하나 만들어서 넘겨온 데이터를 받아줍니다. 

 

id, title, des 에서 넘어온 값들을 받아오고, 받은 값들을 다시 DetailActivity에 뿌려주게 되면

아래와 같은 화면이 나타납니다.

 

+ 버튼은 수정하고 나서 저장할 때, x는 그냥 종료할 때 클릭하는 버튼입니다.

EditText로 구성했기 때문에 DetailActivity에서는 텍스트를 변경 할 수 있습니다.

 

 

 

1. + 버튼 클릭시 

+버튼의 이름은 update입니다. 

update 버튼을 누르면, EditText 있는 값을 다시 한 번 가져와 줍니다. 이유는 수정된 내용이 존재 할 수도 있기 때문입니다. 그렇게 제목과 본문 내용을 가져와주는데 여기서 다른점은 id 값을 가져와 주는 것입니다. 

 

id 값을 가져오는 이유는 우리는 자동으로 로컬 DB에 저장할 때 id 값을 기본키로 자동으로 생성해줬습니다. 

 

이렇게 자동으로 생성된 키는 현재 우리가 수정된 데이터가 몇 번째 id 값을 가지고 있는지를 가지고 변경을 시켜줄것입니다. 

 

db.userDao().update(title, des, id) 로 만들어주고, 액티비티를 종료 시킵니다.

 

2. x 버튼 클릭시

x버튼의 이름은 exit이고 종료 버튼을 누르게 되면 그대로 MainActivity로 돌아가게 됩니다.

 


4. User Class

 

User 클래스에서 세로 속성 ( attribute )의 이름(domain)  값을 설정해 줍니다.

이유는 UserDao 인터페이스에서 update를 수행할 때 새로 들어온 값을 기존에 있던 값과 대체하기 위해서 입니다.

좀더 자세한건 다음 UserDao 인터페이스 코드를 보시면 이해하실 수 있을 것입니다.

 

 


5. UserDao 

 

새로 추가된 부분입니다. update 라고 따로 구성되어있지만, 사용법을 보면 LiveData를 사용해서 바뀔때마다 update를 호출해주면 자동으로 변경되고 값이 바뀌는걸 볼 수 있었습니다. 하지만 저는 지금 자바로만 작성하고 있기 때문에 아무리 눌러도 변경이 되지 않았습니다. 

 

그렇기 때문에 새롭게 쿼리문을 만들어 주었고, 

 

"UPDATE 테이블이름 SET attribute domain WHERE 키"

 

제꺼의 테이블 이름은 memoTable

 

db.userDao().update(title, des, id) 로 넘어온 값에서

user_title = :title

user_des = :des

user_id = :id

값으로 변경을 해주게 됩니다.

 

하지만 여기서도 맨 처음 로컬DB에 삽입했을 때 바로 갱신이 되지 않았습니다

그래서 삽입했을 때  처럼 수정하고 나서도 startActivityForResult 를 사용해서 바로 갱신을 해주려고 했습니다. 

 

그러나 리사이클러뷰에서 넘겨주는것이라 그런지 사용이 되지 않아서 저는 고민을 했습니다.

 

고민은  startActivityForResult 가 onResume 전에 작동하는 거라면?

 

안드로이드 생명주기에서 onResume 전에 바로 작동하는 onStart()인데

onStart에서 새롭게 리사이클러 뷰에 데이터를 바꿔주고나서

onCreate에서 바인딩을 해주면 바로 갱신이 되는 것 처럼 보이지 않을까??

 

라는 생각이였습니다. 

 


6. MainActivity Class

 

그 고민은 성공적이였습니다. 

간단하게 List에 데이터를 전부 담고 리사이클러뷰가 가지고 있는 ArrayList의 값을 갱신해 주게 만드는 부분입니다.

 

 

몰론, 좋은 방법인가에 대한 의문은 들었습니다.

 

onStart를 사용하게 되면 매번 데이터를 갱신해줘야하는거기 때문에 입력화면을 거치지 않아도 계속해서 갱신하게되기 때문에 지금처럼 데이터 양이 적으면 상관없지만, 정말로 데이터의 양이 많아 진다면 속도면에서 느려져서 성능에 저하가 올 거 같기 때문입니다. 

 


7. 실행화면

실행화면입니다. 

기조에는 첫번째 메모에는 1 1111 /  두번째 메모에는 2 22222 / 세번째 메모에는 3 33333 

이런식으로 입력 받았고 수정까지 완료된 모습입니다. 

 

 


후기..

 

빨리 더 능숙하게 다뤄서 디자인패턴을 적용하고 싶은 마음이 ....

항상 느끼지만 하나를 해결하고 나면 더 좋은 방법이 있고, 그 좋은 방법을 쓰기 위해서는 

끊임없이 노력하는거 밖에 없는거 같다...

 

Room 추가, 삭제, 수정 기능 부분만 보실 분은 

https://github.com/leewoongi/MemoPad/commit/6c9e30c44bdff2ea9a700e91510de502239bd6f3

 

전체 프로젝트르 보실 분은 

https://github.com/leewoongi/MemoPad


참고하세요~