정상에서 IT를 외치다

[Android, Realm] Realm 하루 가계부 만들기 본문

안드로이드

[Android, Realm] Realm 하루 가계부 만들기

Black-Jin 2018. 4. 3. 00:24
반응형


모바일 데이터 베이스 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

반응형
Comments