일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 하루 가계부 만들기 본문
모바일 데이터 베이스 Realm 을 이용한 하루 가계부 앱을 만들어 보았습니다.
하루 쓸 금액을 입력 후 소비한 금액을 적습니다. 그러면 하루 금액에서 소비한 금액만큼을 보여주는 앱입니다.
또한 달력을 통해 하루 금액보다 조금 사용했는지 많이 사용했는지를 색으로 구분하여 보여줍니다.
시연 영상은 위와 같습니다.
코드는 모두 코틀린으로 만들었습니다.
Realm 에 대한 설명
http://black-jin0427.tistory.com/7?category=727620
중요 코드만 설명하겠습니다.
위 그림이 MainActivity 입니다.
하루동안 살 금액 입력 버튼과 오른쪽 아래 지출 추가 버튼은 모두 AddMoneyActivity 로 이동합니다.
이 때 type 을 인자로 넘겨 AddMoneyActivity 에서 하루 금액 입력 과 지출 입력 2개의 타입으로 구분합니다.
하루 금액은 sharedPreference 에 저장합니다.
<sharedPreference>
// 몇 일 차 (int)
public static final String PER_DAY = "per_day";
// 하루 남은 금액 (int)
public static final String PER_DAY_MONEY = "per_day_money";
sharedPreference 에서
몇 일 차 인지를 보여주는 PER_DAY 와
하루를 살아가는 금액인 PER_DAY_MONEY 를 저장합니다.
<데이터>
open class Money : RealmObject() {
@Required
var money: Int? = null
@Required
var date1: String? = null //yyyy/MM/dd
@Required
var date2: String? = null //yyyy/MM/dd/HH/mm/ss
}
Realm 데이터는 위와 같이
money( 지출 금액 )와 date1, date2 입니다.
date1 은 어느 날짜의 데이터인지를, date2 는 시간까지 추가했습니다.
<지출 추가>
realm.executeTransaction(Realm.Transaction { realm ->
val perDay = pref.getValue(PrefHelper.PER_DAY, 1)
if(perDay != 1) {
val date = calendar.get(Calendar.DATE) + (perDay-1)
calendar.set(Calendar.DATE, date)
}
val year = calendar.get(Calendar.YEAR)
val month = calendar.get(Calendar.MONTH) + 1
val day = calendar.get(Calendar.DATE)
val hour = calendar.get(Calendar.HOUR_OF_DAY)
val minute = calendar.get(Calendar.MINUTE)
val second = calendar.get(Calendar.SECOND)
val money = realm.createObject(Money::class.java)
Dlog.d("$year/$month/$day/$hour/$minute/$second 에 데이터 저장")
money.date1 = "$year/$month/$day"
money.date2 = "$year/$month/$day/$hour/$minute/$second"
money.money = etActivityAddMoney.text.toString().toInt()
})
캘린더 객체를 통해 데이터를 추가합니다.
calendar.set(Calendar.DATE, date) 는 1일차 2일차 에 해당하는 perDay 을 set 해주어 캘린더 객체의 시간을 해당하는 일차의 객체로 변경해 줍니다.
Calendar 에 관한 설명
http://black-jin0427.tistory.com/19?category=727620
<지출 보여주기>
val calendar = Calendar.getInstance();
if(perDay != 1) {
val date = calendar.get(Calendar.DATE) + (perDay-1)
calendar.set(Calendar.DATE, date)
}
val year = calendar.get(Calendar.YEAR)
val month = calendar.get(Calendar.MONTH) + 1
val day = calendar.get(Calendar.DATE)
Dlog.d("initView : $year/$month/$day")
datas = realm.where(Money::class.java).equalTo("date1", "$year/$month/$day").findAllSortedAsync("date2")
MainActivity 에서 해당 일차에 보여줄 data 는 위와 같습니다.
역시 캘린더 객체를 생성하고 perDay(몇 일 차인지를 나타내는 변수, default = 1) 가 2일차 이상일 떄에는 캘린더 객체의 DATE 를 해당 일차 만큼 플러스 해줍니다.
RealmResult<Money> datas 는 date1(해당 일차의 날짜)에 해당하는 데이터를 가져와서 date2(시간) 순으로 정렬해 줍니다.
이렇게 정렬을 해주어야 시간순으로 리스트에 배치됩니다.
datas.addChangeListener({ money ->
Dlog.w("size : " + datas.size + " , money : " + money)
if(datas.size == 0) {
tvActivityMainDefault.visibility = View.VISIBLE
tvActivityMainRemainMoney.text = perDayMoney.toString() + "원"
tvActivityMainRemainMoney.visibility = View.VISIBLE
} else {
tvActivityMainDefault.visibility = View.GONE
var tempPerDayMoney = perDayMoney
for(money in datas) {
tempPerDayMoney -= money.money!!
}
tvActivityMainRemainMoney.text = tempPerDayMoney.toString() + "원"
tvActivityMainRemainMoney.visibility = View.VISIBLE
}
adapter.notifyDataSetChanged() // UI를 갱신합니다.
})
datas 에 addChangeListener 을 달아주면 데이터가 변경 될떄 마다 비동이고 화면의 UI가 갱신됩니다.
datas 의 사이즈가 0 일 떄에는 하루 금액을,
datas 가 있을 떄에는 하루 금액에서 해당 데이터의 Money 를 빼주어 남은금액이 표시되도록 하였습니다.
< 삭제 >
mRealm.beginTransaction()
mMoney?.deleteFromRealm()
mRealm.commitTransaction()
< 수정 >
mRealm.beginTransaction()
mMoney?.money = etDialogMoney.text.toString().toInt()
mRealm.commitTransaction()
이렇게 realm 을 사용하여 가계부를 완성해 보았는데요
해당 코드는 모두 git hub 에 공유하겠습니다.
https://github.com/dlwls5201/NomadHackathone
'안드로이드' 카테고리의 다른 글
[Android, 권한설정] 안드로이드 권한 설정 (0) | 2018.04.04 |
---|---|
[Android, Bluetooth] Bluetooth 권한 설정 (0) | 2018.04.04 |
[Android, Oreo Notification] 오레오 알림 설정하기 (4) | 2018.03.30 |
[Android, Custom Calendar] Custom Calendar 만들기 (2) | 2018.03.28 |
[Android, Calendar] Calendar 분석 (0) | 2018.03.28 |