일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 리얼하다
- 안드로이드
- 한달독서
- 자취필수템
- 커스텀린트
- 아비투스
- 한달브런치북만들기
- 북한살둘레길
- 함수형 프로그래밍
- 테트리스
- 목적중심리더십
- 프래그먼트
- T자형인재
- 재택근무
- 한달어스
- 한단어의힘
- 끝말잇기
- 슬기로운 온라인 게임
- 캐치마인드
- 지지않는다는말
- 면접
- 브런치작가되기
- 베드트레이
- 소프시스
- 베드테이블
- 어떻게 나답게 살 것인가
- 1일1커밋
- 소프시스 밤부 좌식 엑슬 테이블
- 좌식테이블
- 목적 중심 리더십
- Today
- Total
정상에서 IT를 외치다
[Android, Realm] Realm Diary 본문
모바일 데이터베이스 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
'안드로이드' 카테고리의 다른 글
[Android, Custom Calendar] Custom Calendar 만들기 (2) | 2018.03.28 |
---|---|
[Android, Calendar] Calendar 분석 (0) | 2018.03.28 |
[Android, Parallax View Pager] Custom Parallax View Pager (0) | 2018.03.27 |
[Android, Collapsing Tool bar] Collapsing Tool bar 에서의 status bar (0) | 2018.03.27 |
[Android, Fullscreen] 풀스크린 모드 (5) | 2018.03.26 |