정상에서 IT를 외치다

[Android, Realm] Realm Diary 본문

안드로이드

[Android, Realm] Realm Diary

Black-Jin 2018. 1. 31. 00:38
반응형


모바일 데이터베이스 Realm 을 사용한 Diary 앱 입니다.


Realm 에 대한 설명은 아래 링크에서 확인 할 수 있습니다.

https://realm.io/kr/docs/java/latest/


Realm 을 사용하게 된 이유

1, 모바일 환경에 최적화된 가볍고 빠른 DB

2. 네이티브 객체를 저장하고 사용하기 때문에 DB 구조가 개발자 친화적

3. Realm 문서 100% 한글화


Realm 설정은 최신버전에 맞취 위 링크를 보고 따라해 주시면 됩니다.



Application 의 onCreate 에 아래와 같이 초기화 해줍니다.

// Initialize Realm. Should only be done once when the application starts.
Realm.init(this);

RealmConfiguration config = new RealmConfiguration.Builder()
.deleteRealmIfMigrationNeeded()
.build();

Realm.setDefaultConfiguration(config);


deleteRealmIfMigrationNeeded()

위 함수를 설정해 주면 realm 의 데이터를 바꿀 때 마다 Migration 을 설정해 주어야 되는데


그럴 필요 없이 자동으로 기존의 realm 데이터를 삭제하여 앱이 동작할 수 있게 해줍니다.


migration 에 대한 자세한 설명은


http://developer88.tistory.com/77?category=220430


링크를 통해 확인해 주시기 바랍니다.



Diary 앱의 사용한 데이터 구조


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//Person
public class Person extends RealmObject {
 
    /**
     *  PrimaryKey -> 기본키, 암묵적 @Index 포함
     *  Required -> non null
     *  Index -> 색인 기능
     */
 
    @PrimaryKey
    private int id;
 
    @Required
    private String name;
    private String gender;
    private int age;
 
    private RealmList<Diary> diaries;
 
    //Getter, Setter
}
cs


Person.class : 유저 정보


id 는 유저 정보가 추가 될 때 마다 갖게 되는 고유 번호로 1 부터 순차적으로 증가 된다.

name 은 유저의 이름, gender 는 성별, age 는 나이

diaries 는 해당 유저가 쓴 일기


primaryKey 가 중복이 되면 

io.realm.exceptions.RealmPrimaryKeyConstraintException: Primary key value already exists:

에러로 앱이 죽게 되니 신경써서 작업 해야 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//Diary 
public class Diary extends RealmObject {
 
    @Required
    private String date;
 
    @Required
    private String title;
 
    @Required
    private String content;
 
    @Required
    private Integer personId;
 
    private String tag;
 
    //Getter, Setter
}
cs


Diary.class : 일기


date 는 날짜, title 는 일기 제목, content 는 내용

personId 는 일기를 쓴 유저의 id

tag 는 일기의 색인



Diary 앱의 사용한 View 구조



View 는 MVP 패턴을 사용하여 만들었습니다.


PersonActivity 에서 추가 버튼을 클릭하면 PersonDialog 화면이 나오고 

Person 데이터를 입력하여 추가 한다.


DiaryListActivity 에서는 해당 유저가 쓴 일기 데이터를 볼 수 있으며

테그 검색을 통해 해당 일기만 따로 볼 수 있다.


DiaryWriteActivity 에서는 Diary 데이터를 입력하여 일기를 추가한다.



유저 추가


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mRealm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                // Add a person
                Number maxId = realm.where(Person.class).max("id");
                Log.d("MyTag","maxId : " + maxId);
 
                int nextId = maxId == null ? 1 : maxId.intValue() + 1;
 
                Person person = realm.createObject(Person.class, nextId);
                person.setName(name);
                person.setGender(gender);
                person.setAge(Integer.parseInt(age));
 
            }
        });
cs


먼저 Person class 로부터 가장 큰 id 값을 불러 온다.

만약 id가 없다면 1부터 시작되고 id가 있다면 +1을 해줍니다.


Person 오브젝트를 생성하는데 PrimaeyKey 인 id는 setter 가 아닌 realm.createObject 에서 인자(nextId)로 넣어준다.

그 다음 name, gender, age 를 넣어준다.



유저 삭제


1
2
3
4
5
6
7
8
9
10
11
mRealm.executeTransaction(new Realm.Transaction() {
       @Override
          public void execute(Realm realm) {
                 RealmResults<Diary> diaries
                 = mRealm.where(Diary.class).equalTo("personId", person.getId()).findAll();
                               
                    diaries.deleteAllFromRealm();
                    person.deleteFromRealm();
             }
       });                                
 
cs


유저 리스트를 long click 하면 해당 유저의 데이터인 person 을 넘겨줍니다.


persion 에 해당하는 diaries 를 가져와서 


  diaries.deleteAllFromRealm();


전부 삭제해준 후


  person.deleteFromRealm()


위와 같이 deleteFromRealm() 함수로 간단히 삭제할 수 있습니다.



유저 리스트


1
2
3
4
5
6
7
8
9
RealmResults<Person> datas = realm.where(Person.class).findAllSortedAsync("id");
 
datas.addChangeListener(new RealmChangeListener<RealmResults<Person>>() {
            @Override
            public void onChange(RealmResults<Person> people) {
                Dlog.w("people : " + people);
                adapter.notifyDataSetChanged(); // UI를 갱신합니다.
            }
        });
cs



유저 (Person) 데이터를 id 순서로 가져온 datas 에


addChangeListener 을 설정하여 비동기로 화면 UI 를 변경할 수 있다.





일기 추가


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mRealm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                // Add a diary
                Diary diary = realm.createObject(Diary.class);
                diary.setDate(date);
                diary.setTitle(title);
                diary.setContent(content);
                diary.setPersonId(personId);
 
                if(!TextUtils.isEmpty(tag)) diary.setTag(tag);
 
                Person person = realm.where(Person.class).equalTo("id", personId).findFirst();
                person.getDiaries().add(diary);
 
                mActivity.finish();
 
            }
        });
cs



Diary 오브젝트 생성후 날짜, 제목, 내용, 유저ID, 테그 값을 넣어준다.

그리고 해당하는 유저ID 의 Person class 를 찾은 후 diaries 에 해당 일기를 add 해준다.



일기 수정


1
2
3
4
5
6
7
8
9
10
11
mRealm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                diary.setDate(date);
                diary.setTitle(title);
                diary.setContent(content);

                if (!TextUtils.isEmpty(tag)) diary.setTag(tag);
             
                finish();
            }
        });        
cs


해당 일기의 데이터 diary를 가져와

데이터를 넣어주면 바로 수정이 됩니다.



일기 리스트


1
2
3
4
5
6
7
8
9
10
RealmResults<Diary> diaries 
       = realm.where(Diary.class).equalTo("personId",id).findAllSorted("date");
 
       diaries.addChangeListener(new RealmChangeListener<RealmResults<Diary>>() {
            @Override
            public void onChange(RealmResults<Diary> diaries) {
                Dlog.v("diaries : " + diaries);
                adapter.notifyDataSetChanged(); // UI를 갱신합니다.
            }
        });
cs




일기(Diary) 데이터를 persionId 가 id 이고 date 순서로 가져온 diaries 에


addChangeListener 을 설정하여 비동기로 화면 UI 를 변경할 수 있다.




이렇게 각 유저마다 일기를 저장 할 수 있는 간단한 일기장 앱을 만들어 보았습니다.


git 링크

https://github.com/dlwls5201/Realm-Diary






반응형
Comments