Android/Firebase

[Firebase] Cloud Firestore OR과 LIKE구현하기

lipnus 2018. 8. 2. 01:21
반응형

Cloud Firestore OR과 LIKE를 제공하지 않는다. 직접 코드로 구현해야 한다.



1.검색

//검색 EditText
read_database_activity_edittext.addTextChangedListener(object : TextWatcher{
override fun afterTextChanged(p0: Editable?) {
searchList(p0.toString())
}

override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
}

override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
}

})



2.LIKE

    fun searchList(filterString:String){

//userDTO.name안에 filterString글자가 있을 때 아이템을 filterList에 담겠다 (filter문)
var filterList = listForFilter!!.filter { userDTO ->
userDTO.name!!.contains(filterString)
}
getArrayList.clear()
getArrayList.addAll(filterList)

// getArrayList = filterList as ArrayList<UserDTO> 윗 두줄 대신 이렇게 입력하면
// getArrayList의 주솟값이 변하게 되면서 위쪽의 어댑터가 정상적으로 참조하지 못하게 됨

recyclerview_read_database.adapter.notifyDataSetChanged()
}


Filter문 설명(for 문에 필터 걸기)

for 문에 필터를 걸 수 있습니다.

kotlin에서는 filter라는 키워드를 제공하고 있지만, Java에서는 filter를 다음과 같이 구현할 수 있습니다.

5보다 큰 int에 대해서 *2를 처리하고, 이를 출력하는 코드입니다.

for (Integer integer : list) {
    if (integer > 5) {
        integer *= 2;
        Log.e("TAG", "Index " + integer);
    }
}

위의 코트를 Kotlin의 람다식을 함께 사용하면 아래와 같이 정의할 수 있습니다.

filter에서 5 보다 큰 값을 핕터링 하게 되면, map 키워드에서 검출된 결과만 확인이 가능하며, 이를 출력하게 되는 코드로 Java와 똑같지만 filter가 if 문을 대체하게 됩니다.

list.filter { it > 5 }.map { Log.d("TAG", "index " + (it * 2)) }

filter 원문 코드는 다음과 같습니다.

/**
 * Returns a list containing only elements matching the given [predicate].
 */
public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {
    return filterTo(ArrayList<T>(), predicate)
}

map 원문 코드는 다음과 같습니다.

/**
 * Returns a list containing the results of applying the given [transform] function
 * to each element in the original collection.
 */
@Suppress("NON_PUBLIC_CALL_FROM_PUBLIC_INLINE")
public inline fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> {
    return mapTo(ArrayList<R>(collectionSizeOrDefault(10)), transform)
}


람다설명: https://academy.realm.io/kr/posts/kotlin-2/






2.OR구현

String.split("문자열")하면 문자열을 기준으로 배열에 저장된다.

    //검색 EditText
read_database_activity_edittext.addTextChangedListener(object : TextWatcher{
override fun afterTextChanged(p0: Editable?) {
searchList(p0.toString())
}

override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
}

override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
}

})
}

fun searchList(filterString:String){

//userDTO.name안에 filterString글자가 있을 때 아이템을 filterList에 담겠다 (filter문)
var filterList = listForFilter!!.filter { userDTO ->
checkCharacter(userDTO.name!!, filterString)
}
getArrayList.clear()
getArrayList.addAll(filterList)

recyclerview_read_database.adapter.notifyDataSetChanged()
}




fun checkCharacter(name:String, searchString:String) : Boolean{
var array = searchString.split(" ")

for(item in array){
if(name.contains(item)){
return true
}
}
return false
}


userDTO -> checkCharacter(userDTO.name!!, filterString)

-> 람다가 if문처럼 쓰이는건가? 헷갈림...

반응형

'Android > Firebase' 카테고리의 다른 글

Google Auth  (0) 2019.01.30
Android에 Firebase 파일 추가  (0) 2019.01.08
[Firebase] CloudStore 복합쿼리  (0) 2018.08.01
[Firebase] Cloud Firestore 데이터 읽기  (0) 2018.08.01
[Firebase] Cloud Firestore 데이터입력  (0) 2018.07.30