Nexters / TickTock-android

NEXTERS 14th - TickTock
6 stars 2 forks source link

DB API 문서 #4

Open shouwn opened 5 years ago

shouwn commented 5 years ago

OrmAppCompatActivity

DatabaeHelper 를 사용한 뒤에 액티비티가 끝날 때 release 해줘야 함

이를 위해 AppCompatActivity 를 상속한 클래스 작성

상세

DatabaseHelper

database 에 접근하기 위한 클래스

상세 로직은 객체 생성 시 모두 이뤄지기 때문에 평소에는 DAO 클래스를 얻어낼 때만 사용됨

상세

DAO

데이터베이스에서 객체를 가져오기 위한 DAO 클래스

상세

객체 그래프 탐색 방법

삽입과 업데이트

삽입

객체를 new 해서 생성하고 그 객체를 save 하게 되면 데이터베이스에 삽입하게 됨

save 호출 후 객체는 라이브러리의 추적을 받게 됨

save 메소드 호출 후 collection 으로 된 프로퍼티에 접근 가능하게 됨 *그 전에는 NPE 발생

업데이트

save를 호출한 객체를 수정하고 다시 save 를 호출하면 변경 사항이 DB에 반영됨

객체 그래프 탐색

save 호출한 뒤에는 평소 객체를 사용하던 방법대로 사용하면 됨

databaseHelper.articleDAO.save(article1)

article1.steps.addAll(listOf(
        Step(
                name = "옷 갈아입기",
                time = 10,
                sequence = 2
        ),
        Step(
                name = "씻기",
                time = 10,
                sequence = 1
        ),
        Step(
                name = "밥먹기",
                time = 10,
                sequence = 3
        )
))

save 호출한 뒤에 article 안에 있는 steps 에 Step 을 추가하는 코드

위의 코드에서 addAll 를 수행하면 DB에 step 이 추가 됨 remove도 동일하게 작동

steps.toList() or MutableList 호출로 일반 리스트로 사용 가능. 내부적으로 어떻게 작동하는지 모르기 때문에 조회용도로 사용하기를 권장

대신에 name 이나 time 과 같이 다른 클래스를 참조하지 않는 프로퍼티의 경우 수정 후 save를 호출해야 DB에 반영 됨

shouwn commented 5 years ago

예제 코드

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val days = DayGroup("월,화,수")

    val destination = Destination(
            destinationName = "숙명여대입구",
            time = 30
    )

    val article1 = Article(
            title = "test",
            endTime = Date(),
            days = days,
            destination = destination,
            extraTime = 10
    )

    val article2 = Article(
            title = "test2",
            endTime = Date(),
            days = days,
            destinationName = "압구정역",
            travelTime = 40,
            extraTime = 10
    )

    databaseHelper.articleDAO.save(article1) // DB에 article1 저장
    databaseHelper.articleDAO.save(article2) // DB에 article2 저장

    // DB에 article1 의 id를 fk로 가지는 step 들 저장
    article1.steps.addAll(listOf(
            Step(
                    name = "옷 갈아입기",
                    time = 10,
                    sequence = 2
            ),
            Step(
                    name = "씻기",
                    time = 10,
                    sequence = 1
            ),
            Step(
                    name = "밥먹기",
                    time = 10,
                    sequence = 3
            )
    ))

    // 다시 자면 안 되니까 삭제할 예정인 step 생성
    val sleep = Step(
            name = "다시 자기",
            time = 30,
            sequence = 4
    )

    // article2 의 id를 fk로 가지는 step들을 DB에 저장
    article2.steps.addAll(listOf(

            Step(
                    name = "빨래하기",
                    time = 10,
                    sequence = 2
            ),

            Step(
                    name = "양치질",
                    time = 10,
                    sequence = 1
            ),

            Step(
                    name = "세수",
                    time = 10,
                    sequence = 3
            ),

            sleep

    ))

    // 자는 걸 DB에서 제거함
    article2.steps.remove(sleep)

    // 각 step에 report를 DB에 저장함
    for(step in article2.steps){
        step.reports.add(StepReport(time = 10, reportTime = Date()))
    }

    for(step in article1.steps){
        step.reports.add(StepReport(time = 20, reportTime = Date()))
    }

    // article 이 제대로 저장 됐는지 id를 확인해봄
    // 위에서 article1 을 생성할 때는 id를 파라미터로 넣어주지 않았음
    Log.d(className,
            article1.id.toString())

    // 요일이 제대로 저장 되었는지 확인
    Log.d(className,
            databaseHelper.articleDAO.findAll().joinToString { it.days.toString() })

    // step 들이 제대로 저장 되었는지 확인
    Log.d(className,
            databaseHelper.articleDAO.findAll().joinToString {
        it.steps.sortedBy { step -> step.sequence }.joinToString { step -> step.name }
    })

    // 목적지가 제대로 저장 되었는지 확인
    Log.d(className,
            databaseHelper.articleDAO.findAll().joinToString { it.destinationName })

    // 전체 소요 시간이 제대로 구해지는지 확인
    Log.d(className,
            databaseHelper.articleDAO.findAll().joinToString { it.totalTime.toString() })

    // 각 스탭에 report가 제대로 저장 되었는지 확인
    Log.d(className,
            databaseHelper.articleDAO.findAll().joinToString {
        it.steps.joinToString { step -> step.reports.joinToString { report -> report.time.toString() } }
    })

}
shouwn commented 5 years ago

Article

하나의 flow 정보를 가지고 있는 클래스

프로퍼티 설명 타입 비고
id DB에 저장되는 pk Int
endTime 도착 시간 Date LocalTime으로 변경 예정
color 색상 "#14123"형식으로 작성 String
extraTime 추가 시간 Int
days 사용자가 선택한 요일 목록 DayGroup 새로 작성한 클래스
destinationName 목적지명 String
totalTime 전체 소요 시간 Int
travelTime 목적지까지 이동 시간 Int
steps 해당 article의 step들 Collection

Step

flow 의 하나 하나의 스탭 e.g.) 씻기, 밥 먹기

프로퍼티 설명 타입 비고
id DB에 저장되는 pk Int
name 스탭의 제목 String
time 소요 시간 Int
sequence 스탭의 순서 Int
article 이 스탭이 속한 article Article

Destination

목적지 정보

프로퍼티 설명 타입 비고
id DB에 저장되는 pk Int
vehicle 이동수단 Vehicle enum 타입
destinationName 목적지명 String
time 소요 시간 Int

Preset

프리셋 각 항목

프로퍼티 설명 타입 비고
id DB에 저장되는 pk Int
name 프리셋의 제목 String
time 소요 시간 Int
sequence 프리셋의 순서 Int
template 이 프리셋이 속한 template Template

Template

프리셋이 들어있는 템플릿

프로퍼티 설명 타입 비고
id DB에 저장되는 pk Int
name 스탭의 제목 String
presets 템플릿이 가지고 있는 프리셋 항목들 Collection