엄코딩의 개발 일지

Realm 객체 삭제 후 삽입시 레코드 순서 이상 현상


문제상황


프로젝트를 진행하면서 최근 검색어 기능을 작업을 진행하면서,

생성했던 Realm 객체를 최근 검색 순서대로 정렬해서 보여줘야 하는 경우가 생겼다.

요구사항으로는 최근 검색어는 5개까지만 노출해서 보여주도록 만들어야 했다.


처음 접근했던 방식은, Realm 데이터를 단순하게 생성하고, RecyclerView에서 reverseLayout을 true 값을 주었다.

그렇게해서 가장 마지막에 생성되었던 Realm 객체가 최상단에 보이는 RecyclerView를 만들었다.


하지만,

특정한 사이즈만큼만 RecyclerView에서 보여주는 과정에서 문제가 발생했다.

해당 검색어를 삭제하고, 다른 검색어를 입력하여 Realm 객체를 생성하고 어댑터를 갱신했는데,

최근 검색어가 5개가 있을 때 0번째 index의 아이템을 삭제해주고 Realm 객체를 추가해주면 당연하게 마지막인덱스에 데이터가 쌓일 줄 알았다. 아니었다.


Realm 레코드들은 기본적으로 정렬되지 않았고, 명시적으로 정렬하지 않으면 정렬되지 않은 세트로 간주해야 했다.

일반적으로 레코드들은 삽입 한 순서대로 나오지만, 그걸 보장할 수는 없다.

기술적인 이유는 디스크의 데이터를 압축하는 것이므로 목록 중간에있는 항목을 삭제하면 마지막 항목이 해당 위치로 이동하는 경우가 발생한다.


해결방안

결론은, realm 객체들을 명시적으로 sort를 해주어야 한다.



최근 검색어를 realm 추가하는 소스이다.

기존에는 primary key 없이 realm 객체를 생성했는데, 명시적으로 정렬을 해주기 위해서 primary key를 사용했다.

primary key값을 검색이 이루어진 현재 시간값으로 설정하였다.



그리고 realm 데이터를 불러올 때, primary key 필드명 time을 사용하여 Descending 정렬을 해주었다. 이 과정에서 RecyclerView의 reverseLayout값을 false 값을 주었다.




'Android > Realm' 카테고리의 다른 글

Realm ( Kotlin )  (0) 2018.04.10