본문 바로가기
Android 개발/Room, Realm, Databases

Realm 에서 Thread Error 없이 데이터 조회후 삭제하기

by Developer88 2017. 3. 8.
반응형

오늘은 Android Realm에서 데이터를 조회한 후에,

그 데이터를 삭제하는 것에 대해서 정리를 해보고자 합니다.

생각해보면 그리 어렵지 않은 일인데요.


하지만 Realm에서는 Thread에 대해서 민감하기 때문에,

이 쉬운일이 조금 어렵게 보일때가 있습니다.



1. Realm과 Thread


Realm은  어느 Thread에서나 조회 또는 write할 수 있는데요.

하지만, 서로 다른 Thread에서 데이터를 수정할 수 있다는 애기는 아닙니다.


즉, A쓰레드에서 write하고, B쓰레드에서 Read할 수 있지만,

A쓰레드에서 바로 데이터를 수정해서 Update할 수는 없습니다.

그리고, B쓰레드에서 A쓰레드로 바로 데이터를 넘겨줄수도 없습니다.

쓰레드에 대해, 조금은 까다로운 편입니다.


다른 thread에서 데이터를 수정하고자 하면, 

해당 WorkerThread에서, 수정하고자 하는 데이터 객체를 조회 후에 수정할 수 있습니다.


즉, PrimaryKey vaule값처럼, 데이터를 조회할 기준값을 가지고, 

수정하고자 하는 쓰레드에서, 원하는 데이터를 조회해서, 객체를 얻어온 후에 수정할 수 있다는 것이죠.

아래에서, 실제로 구현해보면서 정리해보겠습니다.


2. 데이터 모델 Class


본격적으로 구현하기 전에,

먼저 아래와 같은 데이터모델 클래스를 사용하겠습니다.

제 블로그에서 계속 쓰고 있는, Student Class이네요.




2. 데이터 생성

아래와 같이, 비동기 방식으로 workerThread에서 데이터를 생성하였습니다.




2. 데이터 조회 후 삭제하기 (Bad Case)


그럼 데이터를 조회한 후의 삭제하는 방법 중, 잘못된 방법에 대해서 알아보겠습니다.

아래와 같이 데이터를 조회후, deleteFromRealm()메소드를 사용하여, 비동기로 삭제하는 코드를 작성하였습니다.




실행해보면 아래와 같이, IllegalStateException을 발생시킵니다.

Realm객체는 생성된 Thread에서만 Access가 가능하다고 하는군요.



좀더 생각해보기전에,  executeTransactionAsync 소스코드를 보고 가겠습니다.

executeTransaction과 비슷하지만, Worker thread에서 동작한다고 나와있구요.


만약 Realm이 다른 thread에서 열린다면, IllegalStateException 을 throws한다고 나와있네요.

Thread문제에 봉착하게 되었다는 걸 다시 한번 알 수 있습니다.


즉, 메인 쓰레드에서 조회해서, WorkerThread에서 delete하려고 했으니 Exception을 받은 거죠.




3. 데이터 조회 후 삭제하기 


그럼 Exception없이 하려면 어떻게 해야할까요?


앞서, Realm과 Thread에 대해서 애기하면서,

Realm에서는 다른 Thread에서 데이터를 수정할려면,

해당 Thread에서 조회해서 객체를 수정하라고 되어있습니다.


executeTransactionAsync(){} 메소드에 인자로 넘겨주는 익명클래스에서,

데이터를 조회해서 수정하면 되겠네요.

이렇게하면, WorkerThread에서 객체를 조회한 후에, delete 한 것이 되니까요.


아래와 같이 수정한 후 실행하면, 이상없이 동작하는 걸 확인 할 수 있습니다.




아래와 같이 잘 삭제되는 것을 볼 수 있습니다.




마지막으로 위에서 사용한 isValid의 소스코드를 보고 마무리하겠습니다.

RealmObject가 유효하다면, true를 돌려주는데요. 한가지 주의할 점은 관리되지 않는 객체에 대해서도 true를 돌려준다는 점입니다.

그리고 null값에 대해서도 check가 가능하다고 하는군요.




728x90

댓글