카테고리 보관물: Android

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 메소드 재정의 후 다시 비교해 보면 정확하게 존재여부가 판단되는 것을 확인하실 수 있습니다.

Android ROOM in 조건 변수 사용

개요

Android ROOM 사용 시 변수를 넘겨서 조건으로 사용하는 경우가 많습니다. 단순한 조건이나 개수가 많지 않은 경우 and 나 or 연산자로 충분합니다. 그러나 비교해야 하는 대상이 많아지게 되면 or 조건으로 나열하는 것이 쉽지 않습니다. 그래서 in 연산자로 대상을 나열해서 조건식으로 적용하게 됩니다. 이번글에서는 Andorid ROOM in 조건 변수 사용 방법을 알아보도록 하겠습니다.

전달변수

다음 코드와 같이 변수를 넘겨서 조건식에 들어가도록 합니다.

@Query("SELECT * FROM your_table where data_type = :dataType")
fun getYourData(dataType:String): YourClass

그러면 변수를 문자열 형태로 ‘A’, ‘B’, ‘C’ 이렇게 조합해서 전달하면 되지 않을까 생각할 수 있습니다.

@Query("SELECT * FROM your_table where data_type in (:dataTypeCondition)")
fun getYourData(dataTypeCondition:String): YourClass

그러면 최종적으로 다음과 같은 명령어로 해석된다고 예상할 수 있습니다.

SELECT * FROM your_table where data_seq in ('A', 'B', 'C')

그러나 이렇게 하면 원하는 결과가 나타나지 않습니다.

올바른 방법

변수를 하나의 문자열로 생각하지 않고 문자열 배열이나 ArrayList 형태로 전달해야 합니다. 아래코드에서는 ArrayList 형태로 전달했습니다. dataTypeCondition 변수에 원하는 조건을 다음과 같이 add 로 추가한 후 전달하면 됩니다.

dataTypeCondition.add("A")
dataTypeCondition.add("B")
dataTypeCondition.add("C")
@Query("SELECT * FROM your_table where data_type in (:dataTypeCondition)")
fun getYourData(dataTypeCondition:ArrayList<String>): YourClass

위와 같이 변수를 적용하면 in 조건이 적용된 결과가 반환됩니다.