首页 > 解决方案 > Firebase 数据库搜索查询无法正常工作

问题描述

我正在创建一个社交应用程序,例如 facebook,但在使用 Firebase 数据库查询进行查找朋友活动时遇到了困难。

问题是没有显示搜索结果(用户)。 当我将 allUsersRef 作为参数放入 setQuery() 时,会显示用户,但是当我将 searchFriendsQuery 作为参数时,它不会显示任何内容。 我看了很多答案来解决我的问题,但没有一个有效。

这是我陷入困境的方法,正如我所说,此方法按全名搜索 firebase 数据库,然后显示与用户输入匹配的用户:

private fun searchFriends(userInputText: String) {
        Log.i("SEARCH",userInputText)
        Toast.makeText(this,"Searching...",Toast.LENGTH_LONG).show()

        val searchFriendsQuery = allUsersRef.orderByChild("fullname")
            .startAt(userInputText)
            .endAt(userInputText + "\uf8ff")

        val options: FirebaseRecyclerOptions<FindFriends> = FirebaseRecyclerOptions.Builder<FindFriends>()
            .setQuery(searchFriendsQuery,FindFriends::class.java)
            .build()

        val firebaseRecyclerAdapter = object: FirebaseRecyclerAdapter<FindFriends,FindFriendsViewHolder>(options) {
            override fun onBindViewHolder(viewHolder: FindFriendsViewHolder, position: Int, model: FindFriends) {
                viewHolder.setProfilesInfo(model)
            }
            override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FindFriendsViewHolder {
                val view: View = LayoutInflater.from(parent.context)
                    .inflate(R.layout.users_display_layout, parent, false)
                return FindFriendsViewHolder(view)
            }
        }
        firebaseRecyclerAdapter.startListening()
        searchOutputList.adapter = firebaseRecyclerAdapter
    }

这是我的 viewHolder 类:

class FindFriendsViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
        var mView = itemView

        private val friendsProfileImage: CircleImageView = mView.findViewById(R.id.find_users_profile_image)
        private val friendsFullName: TextView = mView.findViewById(R.id.find_user_full_name)
        private val friendsStatus: TextView = mView.findViewById(R.id.find_user_status)

        fun setProfilesInfo(friends: FindFriends){
            friendsFullName.text = friends.fullname
            friendsStatus.text = friends.status
            Glide.with(itemView.context)
                .load(friends.profileimage)
                .into(friendsProfileImage)
        }
    }

这是我的模块类:

class FindFriends {
    var profileimage: String? = null
    var fullname: String? = null
    var status: String? = null
}

这些是代码中变量的值:

private lateinit var allUsersRef: DatabaseReference
private lateinit var searchOutputList: RecyclerView
private lateinit var searchInputText: EditText

allUsersRef = FirebaseDatabase.getInstance().reference.child("Users")

searchOutputList = findViewById(R.id.search_list)
searchOutputList.setHasFixedSize(true)
searchOutputList.layoutManager = LinearLayoutManager(this)

searchInputText = findViewById(R.id.search_input_box).toString()

JSON 导出文件:

"Users" : {
    "Q4RWEkf8YsRnQppwpEYrSMKa0M82" : {
      "country" : "Mexico",
      "dateofbirth" : "Unknown",
      "fullname" : "Oswaldo Escobedo",
      "gender" : "Unknown",
      "profileimage" : "https://firebasestorage.googleapis.com/v0/b/myhero-8778b.appspot.com/o/Profile%20Images%2FQ4RWEkf8YsRnQppwpEYrSMKa0M82.jpg?alt=media&token=44fe278b-a7f0-42c7-90b9-dfbcc57bf733",
      "relationshipstatus" : "Unknown",
      "status" : "Active",
      "username" : "oswi73"
    },
    "h7DPxSQax3PNYFcXNDSgk4H9zyF2" : {
      "country" : "Mexico",
      "dateofbirth" : "Unknown",
      "fullname" : "Jenny Balandran",
      "gender" : "Unknown",
      "profileimage" : "https://firebasestorage.googleapis.com/v0/b/myhero-8778b.appspot.com/o/Profile%20Images%2Fh7DPxSQax3PNYFcXNDSgk4H9zyF2.jpg?alt=media&token=99633998-46f4-4a64-806d-3a8bc7ec0580",
      "relationshipstatus" : "Unknown",
      "status" : "Active",
      "username" : "oescob16"
    },
    "nq6OPYGHuAdCApuyXhLYHLLdOtA3" : {
      "country" : "México ",
      "dateofbirth" : "Unknown",
      "fullname" : "Oswaldo Escobedo",
      "gender" : "Unknown",
      "profileimage" : "https://firebasestorage.googleapis.com/v0/b/myhero-8778b.appspot.com/o/Profile%20Images%2Fnq6OPYGHuAdCApuyXhLYHLLdOtA3.jpg?alt=media&token=55f8c342-9e74-400f-8038-5a7af208510e",
      "relationshipstatus" : "Unknown",
      "status" : "Active",
      "username" : "oescobedo3 "
    }
  }

这是 userInputText 的日志值:

2020-06-14 19:26:11.288 10129-10129/com.example.bemyhero I/SEARCH: androidx.appcompat.widget.AppCompatEditText{e57e7ff VFED..CL. .F...... 30,103-1080,313 #7f08012a app:id/search_input_box aid=1073741824}

标签: javaandroidfirebasekotlinfirebase-realtime-database

解决方案


您似乎已经调用toString了一个EditText字段。将其传递给数据库是行不通的,因为您将在数据库中搜索文字 string "androidx.appcompat.widget.AppCompatEditText{e57e7ff VFED..CL. .F...... 30,103-1080,313 #7f08012a app:id/search_input_box aid=1073741824}"

您需要从该字段中获取文本,然后搜索:

searchFriends(textField.getText().toString());

推荐阅读