글쓴이 보관물: Toughman

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 조건이 적용된 결과가 반환됩니다.

사운드 카운터 안드로이드 앱

개요

가끔 일정한 소리가 몇번이나 반복되었는지 세어야 할 경우가 있었습니다. 문득 특정한 소리의 개수를 세어주는 앱이 있으면 좋겠다는 생각이 들어 만들게 되었습니다. 이름은 사운드 카운터로 정했고 소리가 나면 +1 을 해서 그 숫자가 나타납니다.

구상

측정하려는 소리의 크기가 다양해서 숫자를 더하는 소리의 크기를 조절할 수 있도록 해야할 것 같았습니다. 그리고 그 설정값을 보여주고 실제 소리가 났다는 것을 보여주는 부분이 필요할 것 같았습니다. 마지막으로 세어진 소리의 개수를 보여주는 부분이 있어야 할 것 같았습니다.

개발

작업을 진행하다 보니 잠깐 멈출 수 있는 기능이 있어야 할 것 같았습니다. 구상한 것을 다음 화면과 같이 작업 했습니다.

사운드 카운터 초기 화면

소리 입력은 마이크로 받았고 별도로 저장되지 않도록 작업했습니다. 문제가 없다고 생각했는데 특정버전 이상에서 테스트 해보니 녹음을 시작하는 부분에서 오류가 발생했습니다. 출력 방향을 /dev/null 로 지정했는데 Android Q 이상에서는 오류가 발생했습니다. OS 버전을 판단해서 동작하도록 수정했습니다.

입력된 소리를 시각적으로 표현하는 부분은 세기에 따라 위쪽으로 Peak가 올라가는 형태로 구현했습니다.

소리 시각화

박수 소리로 테스트 해 보았는데 문제없이 동작했습니다. 좀더 크거나 작은 소리는 감도를 조절해서 개수를 셀 수 있도록 사용하면 될 것 같습니다.

다음 주소에서 확인하실 수 있습니다(광고포함).

https://play.google.com/store/apps/details?id=jaeyoung.kim.soundcounter