카테고리 보관물: Android

Android ROOM 자료가 입력된 DB 사용하기

개요

이전에 다루었던 Android ROOM 초기 자료 입력하기 글에서는 적은 양의 자료에만 적용할 수 있습니다. 자료가 많은 경우 텍스트 파일을 읽어 DB에 입력하는 방법을 생각해 볼 수 있습니다. 또 서버에 연결해서 자료를 받아와 입력하는 등 여러가지 방법이 있을 수 있습니다. 그러나 앱에서 처리하게 되면 모든 사용자들이 입력이 끝날 때 까지 기다려야 하는 문제가 있습니다.

DB에 입력되는 자료가 고정되어 있고 양이 많은 경우 개발 시 미리 입력해 놓은 DB를 적용하면 간편합니다. 이번글에서는 그 방법을 알아보도록 하겠습니다.

데이터 미리 채우기

SQLite DB에 자료를 입력하는 방법은 여러가지가 있습니다. 필자는 Android Studio 에 있는 Database Inspector 를 이용해서 다량의 자료를 DB에 입력했습니다. 미리 입력된 DB를 사용하는 방법은 개발자 문서에 잘 설명되어 있습니다.

DB 파일 준비

필자는 에뮬레이터에 저장되어 있는 DB 파일을 Device File Explorer 로 접근해서 로컬 PC에 저장했습니다. 그 다음 Android Studio 에서 assets 폴더를 생성하고 DB 파일을 복사했습니다.

assets 폴더 하위에 추가한 DB 파일
assets 폴더 하위에 추가한 DB 파일

코드추가

DB 초기 생성 부분에 다음과 같이 코드를 추가합니다.

fun getInstance(context: Context): yourDB? {
    if (INSTANCE == null) {
        synchronized(yourDB::class) {
            INSTANCE = Room.databaseBuilder(context.applicationContext,
                yourDB::class.java, "your.db")
                .addCallback(dbCallback)
                .createFromAsset("your.db")
                .fallbackToDestructiveMigration()
                .build()
        }
    }
    return INSTANCE
}

이렇게 하면 미리 자료를 입력해 놓은 DB 파일을 이용하게 됩니다. 앱에서 별도로 자료를 입력하는 과정을 수행할 필요가 없어지게 됩니다. 단, 정의된 Entity 와 미리 자료가 채워진 DB 파일의 구조가 같아야 합니다.

이번글에서는 미리 준비된 DB 파일을 ROOM 을 사용한 프로젝트에 적용하는 방법을 알아보았습니다.

Android 사용자 정의 클래스(Custom Class) ArrayList 내 존재여부 판단

개요

여러가지 이유로 인해 개발자가 사용자 정의 클래스(Custom Class)를 사용하는 경우가 많습니다. 이 클래스를 ArrayList 형태로 만들고 자료를 추가해서 사용하게 됩니다. 자료를 추가하기 전 이미 같은 자료가 있는지 알고 싶을 때가 있습니다. 이럴 때 어떻게 해야 하는지 알아보도록 하겠습니다.

ArrayList 자료 존재 여부 판단

ArrayList 내에 자료가 이미 존재하는지의 여부는 다음과 같은 방법으로 판단합니다.

//list: ArrayList<String>

//if (!list.contains("ABC")) {
if ("ABC" !in list) {
    //your code
}

사용자 정의 클래스도 비슷한 방법으로 판단할 수 있을 것 같습니다.

//list: ArrayList<YourCustomClass>

//if (!list.contains(YourCustomClass(yourCustomClass.field1, yourCustomClass.field2))) {
if (YourCustomClass(yourCustomClass.field1, yourCustomClass.field2) !in list) {
    //your code
}

그러나 항상 false 가 반환됩니다. 그 이유는 정확한 비교 방법이 없기 때문입니다.

equals 재정의(equals override)

사용자 정의 클래스에 다음과 같이 equals 메소드를 재정의 합니다.

override fun equals(other: Any?): Boolean {
    return when (other) {
        is YourCustomClass -> {
            other.field1 == this.field1 && other.field2 == this.field2
        }
        else -> false
    }
}

equals 메소드 재정의 후 다시 비교해 보면 정확하게 존재여부가 판단되는 것을 확인하실 수 있습니다.