woong's

Android DB Realm 사용하기 본문

Develop/Android

Android DB Realm 사용하기

dlsdnd345 2016. 3. 14. 18:38

Android DB Realm 사용하기


안녕하세요. 안드로이드 개발을 하다보면 Local DB가 필요한 경우가 있습니다.

하지만 Local DB를 사용하려면 테이블을 만들고 Helper를 작성하고 쿼리문을 작성하고

여러 불편한점이 많아서 간단한 데이터의 경우 String Json 화 시켜서 SharedPreferences

에 저장하곤 했습니다. 여러 컨퍼런스나 커뮤니티를 보면 간혹 Realm 정보나 얘기를 들을수

있는데 이번에 기회가 되어서 사용해보려 합니다. 간단하게 사용해보는 정도로 정리해보려 합니다.


소개


우선 많은 메이져 사에서 사용하고 있는것 같습니다. 메이져사 뿐만아니라 소개를 보면 저희가 알만한

스타트업에서도 많이 사용 하고 있습니다.

Gradle , Rxjava , 암호화 , 여러 플랫폼 지원 등 다방면으로 사용할수 있도록

언어도 여러 나라 지원하는 있습니다. 무엇보다 좋은것은 한글을 지원하고 있네요!

속도면에서도 기존의 sqlLite 보다 월등히 앞서는 것을 볼수 있습니다. 이런것을 보면 한번 시도,

적용해보는것도 좋을것 같다는 생각이 듭니다.











사전준비작업


1
2
3
4
5
6
7
8
 
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.2.0'
    compile 'io.realm:realm-android:0.87.4'
}
 
cs


Realm 을 사용하기 위해서 Android Build.gradle 파일에 라이브러리 추가 작업을 진행 합니다.

프로가드를 사용하시면 난독화를 위해서 아래 코드가 필요합니다.


1
2
3
4
5
6
-keep class io.realm.annotations.RealmModule
-keep @io.realm.annotations.RealmModule class *
-keep class io.realm.internal.Keep
-keep @io.realm.internal.Keep class * { *; }
-dontwarn javax.**
-dontwarn io.realm.**
cs


코드작성


이제 준비가 완료 되었습니다. 간단하게 디비에 정보 저장 및 검색 , 삭제를 해보도록 하겠습니다.

정보를 저장 하기 위해서는 테이블이 필요합니다. Realm에서는 테이블을 만들기위해서 VO 객체를

통해서 테이블이 생성되는것 같습니다. 간단하게 User VO 를 작성 해보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class UserVO extends RealmObject{
 
    @PrimaryKey
    private String name;
    private int age;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
}
cs


위와 같이 VO를 만들었습니다. 생소한 어노테이션이 있습니다. 코드만 봐도

아시겠지만 @PrimaryKey 어노테이션 사용으로 DB테이블의 name 이

PrimaryKey로 생성됩니다. 이렇게  Class 가 테이블 이름이 되고 

변수가 컬럼 이름이 됩니다.


생성된 테이블의 데이터가 있는지 없는지 검색 코드부터 작성해 보겠습니다.


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
32
33
34
35
36
37
38
39
40
41
public class MainActivity extends AppCompatActivity {
 
    private static final String TAG = MainActivity.class.getSimpleName();
 
    private Realm mRealm;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
 
        //데이터 초기화
        init();
    }
 
 
    /**
     * 데이터 초기화
     */
    private void init(){
 
        mRealm = Realm.getInstance(this);
 
        RealmResults<UserVO> userList = getUserList();
        Log.i(TAG,">>>>>   userList.size :  " + userList.size()); // :0
 
 
 
    }
 
 
    /**
     * 유저 정보 데이터 리스트 반환
     */
    private RealmResults<UserVO> getUserList(){
        return mRealm.where(UserVO.class).findAll();
    }
 
}
 
cs


위 코드에서 Realm 객체를 초기화 하였고 getUserList 함수에서 User 테이블의 정보를

가져오는 코드를 작성하였습니다. 여기서 String 으로 작성된 코드가 아니여서 오타를 통한

쿼리 에러를 피할수 있습니다. 위와 같이 검색하면 리스트의 갯수는 0개 입니다.

검색 기능으로써 sort , 조건 검색들 여러 기능들이 있습니다.  점을 통해서 살펴보면 쉽게 사용 할수있습니다.


이제 코드를 저장해서 리스트의 갯수를 1개로 만들어 보아야 겠습니다.


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
 
 
 
 
 
 
 
 
 
 
 
 
public class MainActivity extends AppCompatActivity {
 
    private static final String TAG = MainActivity.class.getSimpleName();
 
    private Realm mRealm;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
 
        //데이터 초기화
        init();
 
    }
 
 
    /**
     * 데이터 초기화
     */
    private void init(){
 
        mRealm = Realm.getInstance(this);
 
        RealmResults<UserVO> userList = getUserList();
        Log.i(TAG, ">>>>>   userList.size :  " + userList.size()); // :0
 
        //유저 정보 데이터 DB 저장
        insertuserData();
 
        Log.i(TAG, ">>>>>   userList.size :  " + userList.size()); // :1
 
    }
 
 
    /**
     * 유저 정보 데이터 리스트 반환
     */
    private RealmResults<UserVO> getUserList(){
        return mRealm.where(UserVO.class).findAll();
    }
 
 
    /**
     * 유저 정보 데이터 DB 저장
     */
    private void insertuserData(){
 
        mRealm.beginTransaction();
        UserVO user = mRealm.createObject(UserVO.class);
        user.setName("John");
        user.setAge(27);
        mRealm.commitTransaction();
    }
 
 
}
 
 
 
cs


insertUserData() 함수를 호출해서 데이터를 테이블에 저장하였습니다. 그후에 사이즈를 확인하면 1로 바뀐것을 확인

할수 있습니다. 하지만 여기서 이상한점이있습니다. 데이터를 저장하고 검색을 하지 않았는데 사이즈의 갯수가 변경되었습니다.

Realm 의 장점으로 라이브로 데이터를 갱신해주는것이 있습니다. 그래서 따로 검색을 다시 하지 않아도 자동 갱신이 됩니다.

함수를 보면 트랙잭션을 시작하고 종료하는 부분이 있습니다. 이부분을 명시하여 하나의 실행단위를 명확히 하려 하는것 같습니다.



이제 데이터를 삭제하는 코드를 작성해 보겠습니다.


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
public class MainActivity extends AppCompatActivity {
 
    private static final String TAG = MainActivity.class.getSimpleName();
 
    private Realm mRealm;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
 
        //데이터 초기화
        init();
 
    }
 
 
    /**
     * 데이터 초기화
     */
    private void init(){
 
        mRealm = Realm.getInstance(this);
 
        RealmResults<UserVO> userList = getUserList();
        Log.i(TAG, ">>>>>   userList.size :  " + userList.size()); // :0
 
        //유저 정보 데이터 DB 저장
        insertuserData();
 
        Log.i(TAG, ">>>>>   userList.size :  " + userList.size()); // :1
 
        //유저 정보 삭제
        deleteuserData();
 
        Log.i(TAG, ">>>>>   userList.size :  " + userList.size()); // :0
    }
 
 
    /**
     * 유저 정보 데이터 리스트 반환
     */
    private RealmResults<UserVO> getUserList(){
        return mRealm.where(UserVO.class).findAll();
    }
 
 
    /**
     * 유저 정보 데이터 DB 저장
     */
    private void insertuserData(){
 
        mRealm.beginTransaction();
        UserVO user = mRealm.createObject(UserVO.class);
        user.setName("John");
        user.setAge(27);
        mRealm.commitTransaction();
    }
 
 
    /**
     * 유저 정보 삭제
     */
    private void deleteuserData(){
 
        mRealm.beginTransaction();
 
        RealmResults<UserVO> userList = mRealm.where(UserVO.class).findAll();
        userList.remove(0);
        mRealm.commitTransaction();
    }
 
 
}
 
cs


 deleteuserData() 함수를 호출해서 삭제를 하였습니다. 인덱스 삭제 , 오브젝트 삭제 등 여러 삭제를 제공하고 있습니다.


결론


위와 같이 사용해본 결과 오타로 인한 쿼리 에러를 만나지 않아서 굉장히 좋았습니다.

또한 테이블 생성을 자동으로 해주고 매칭이 되기 때문에 간편하게 DB를 작성할 수있었습니다.

여기서는 사용해보지 않았지만 , 트랜잭션 관리 , 검색 등 편리하게 사용할수 있는부분이 있고

비동기 처리를 통해서 데이터가 많은 경우 버퍼를 주지 않도록 해주는 기능들도 있습니다.

앞으로의 프로젝트에 적용해보록 해보아야 겠습니다.




Comments