어제 나를 멘붕(?)으로 빠져들게 한 키워드는 COLLATE LOCALIZED 였다. SQLite에서 문자열을 사용자 로케일 순으로 정렬하는 방법을 찾고 있었는데 대부분 검색결과는 order by에 COLLATE LOCALIZED를 키워드로 주면 된다는 내용이었다.

하지만 결과는 제대로 나오지 않았다! Xcode에서 실행했을 때는 아예 결과가 아무것도 나오지 않아서, SQLite Manager로 직접 쿼리를 날려서 확인한 결과 LOCALIZED 키워드는 SQLite 문서에도 없는 것이었다. (당연히 Xcode에서는 SQLite 오류 때문에 결과 값이 없었고…) 다시 구글링 검색. 얻은 결론은 안드로이드 SDK 내에 LOCALIZED 키워드를 임의로 등록해서 현재 사용자 로케일 값을 갖도록 한 거 같다는 결론이었다. 근데 이걸 iOS에서는 어떻게 적용할까?

SQLite 쿼리로는 도저히 답이 없었다. (아니지, 정확하게 말하자면 내가 해결하지 못했다.) 한글과 영어, 숫자까지는 뽑아내서 우선순위 값을 준 이후에 order by에 우선순위 값, 문자열을 주면 어느 정도 해결은 할 수 있었지만, 일본어나 중국어 우선일 경우에는 완벽한 결과를 얻어낼 수 없었다.

그래서 나는 NSSortDescriptor를 사용했다. 결국, SQLite에서 가져온 결과 값이 있는 배열을 Objective-C 차원에서 다시 사용자 로케일 순으로 정렬하도록 했다. 가장 확실한 방법이고 일단 구현은 해야 하니까. (물론 SQLite 쿼리를 실행하고, 다시 정렬하는 과정이 있기 때문에 속도 문제는 있을 수도 있다.) NSSortDescriptor를 사용자 로케일 순으로 정렬하도록 만들고 배열의 sortedArrayUsingDescriptors: 메서드를 사용했다. 결과적으로 잘 동작하지만 원래 원하는 결과는 한국어일 경우 숫자 > 한국어 > 영어 > 중국어 > 일본어 순이었는데, iOS에서는 숫자 > 한국어 > 중국어 > 영어 > 일본어 순으로 정렬한다. (이상해서 OS X의 Finder에서 정렬해봤는데 같은 결과였다.)

간단한 소스코드