Meetup1511 sqlite2realm

SqliteToRealm: 작은 경험 이야기

안드로이드의 SQLite의 데이터를 Realm으로 옮기는 방식이 궁금하신가요? Pluu라는 닉네임으로 활동 중인 노현석님이 Realm 사용자 모임에서 SqliteToRealm을 사용하여 Sqlite에서 Realm으로 마이그레이션한 경험을 공유합니다.


Realm 도입 배경 및 SqliteToRealm을 사용한 마이그레이션

노현석님의 11월 20일 Realm 사용자 모임 발표 입니다.

프로젝트에 Realm을 도입한 배경과 함께 SqliteToRealm에 대한 소개와 적용 방법, Realm으로의 마이그레이션 중 좋았던 점과 아쉬웠던 점에 대해서 발표해 주셨습니다. Sqlite로부터 Realm으로 마이그레이션을 하고자 하는 분을 위한 조언도 덧붙여 주셨습니다.

Realm 도입 배경

  • 웹툰을 가져와서 보여주는 앱을 혼자서 개발하던 중에 Bitbucket에만 올리던 기존 소스를 GitHub에 공개하기로 함
  • 공개를 위해 소스를 리팩토링하면서 여러 가지를 바꾸던 중 Realm을 적용하게 됨
  • 바꾸기 전 오픈 소스
    • jsoup
    • butterknife
    • glide
    • SQLbrite
    • rxandroid
  • 바꾼 후 오픈 소스
    • okhttp
    • jsoup
    • butterknife
    • glide
    • Realm
    • otto
    • rxandroid

이런 개발 뉴스를 더 만나보세요

Realm 적용 범위

  • Favorite Info : 즐겨 찾기 정보
  • Read Info : 책갈피 정보

Favorite ———— service Name : String Toon ID : String

Read ———— service Name : String Toon ID : String Episode ID : String

기존 사용 오픈 소스: SQLbrite

  • Picasso와 OKHttp, Retrofit을 만든 Square사에서 제작
  • SQLiteOpenHelper + Reactive 기능 제공
  • 사용 계기는 Rx 관련 세미나에서 Rx를 접했고 Square사에 대한 신뢰가 있었기 때문임
  • 코드는 Rx와 동일한 구조
  • Realm 다음으로 간편한 라이브러리

Realm

  • Core 부문은 NDK
  • Realm과 Sqlite는 같지 않음
  • Sqlite 마이그레이션에 대한 가이드가 없음

SqliteToRealm

  • 마이그레이션 방법을 찾다가 발견한 애드온
  • 한국 페이지에는 없지만 Realm의 add-ons 사이트가 존재함
  • SQLiteToRealm도 add-ons > Java > Tools에서 접근 가능
  • SQLite의 데이터를 Realm에 넣는 코드
public void pushSynonymsToWords(){
    SqliteHelper dbs = SqliteHelper.getInstance();
    RealmHelper dbr = RealmHelper.getIntance();
    List<Word> rawWords = getAllRawWords();
    List<List<String>> records = dbs.getRecords("synonym");
    List<IntPair> synonyms = new ArrayList<>();
    for(List<String> record : records){
        if(null == record.get(0) || null == record.get(1))
            continue;
        IntPair pair = new IntPair(Integer.parseInt(record.get(0)),Integer.parseInt(record.get(1)));
        synonyms.add(pair);
    }
    dbr.addSynonymToWords(synonyms);
}
  • SQLite를 오픈하고 데이터를 가져와서 SQLite를 닫고 Realm 객체를 받아와서 트랜잭션을 시작한 후 데이터를 넣고 커밋하는 과정을 거침

마이그레이션 중 느낀 점

  • Realm의 빠른 속도와 ORM인 점이 좋았음
  • 혹시 싶어서 기존 SQLite 코드를 삭제할 수 없었음
    • SQLiteOpenHelper
    • Item Class
  • 한국어 사이트에 add-ons 페이지가 없는 것이 아쉬움

일본 사이트의 피드백

  • APK 크기가 커지는 문제는 ABI Split으로 해결 가능
  • 수만 건 이상의 큰 데이터를 옮기려면 트랜잭션에서 처리하는 단위가 큰 경우 OOM 발생 가능해서 100~200 단위로 처리함
  • Realm version에 맞는 Proguard 처리가 필요함
  • SQLite와 Realm 속도 비교
query, count SQLite Realm
Insert, 20 Count 150ms 100ms
Search, 4 Count 14ms 8ms
Search, 4 Count 17ms 10ms
Insert, 16 Count (62kb) 97ms 38ms

마이그레이션시 추천 사항

  • 처음부터 Realm을 사용하는 것을 추천함
  • 마이그레이션시 Rx를 쓰면 코드가 깔끔해짐
  • 실행 시 SqliteToRealm이 필요한데 Preference에 flag를 등록해서 나중에는 Realm 작업이 실행되지 않도록 함

다음: 안드로이드를 위한 Realm #5: Realm과 함께 하는 안드로이드 아키텍처 컴포넌트

General link arrow white

컨텐츠에 대하여

이 컨텐츠는 저자의 허가 하에 이곳에서 공유합니다.

노현석

4 design patterns for a RESTless mobile integration »

close