首页 > 解决方案 > 如何在 kotlin 中创建一个简单的 firebase 搜索查询

问题描述

因为我想实现一个搜索,如果有人在搜索栏中输入出生年份,那么所有出生在该特定年份的所有候选人都将显示在我的回收站视图中。

项目活动

class ItemsActivity : AppCompatActivity() {

    private var mStorage:FirebaseStorage? = null
    private var mDatabaseRef:DatabaseReference? = null
    private var  mDBListener:ValueEventListener? = null
    private lateinit var mCandidate:MutableList<Candidate>
    private lateinit var listAdapter:ListAdapter

    private lateinit var binding: ActivityItemsBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        binding= ActivityItemsBinding.inflate(layoutInflater)
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        binding.rvList.setHasFixedSize(true)
        binding.rvList.layoutManager = LinearLayoutManager(this@ItemsActivity)
        binding.pbLoding.visibility = View.VISIBLE
        mCandidate = ArrayList()
        listAdapter = ListAdapter(this@ItemsActivity,mCandidate)
        binding.rvList.adapter = listAdapter
        /**set Firebase Database*/
        mStorage = FirebaseStorage.getInstance()
        mDatabaseRef = FirebaseDatabase.getInstance().getReference("candidate_upload")
        mDBListener = mDatabaseRef!!.addValueEventListener(object : ValueEventListener{
            override fun onCancelled(error: DatabaseError) {
                Toast.makeText(this@ItemsActivity,error.message, Toast.LENGTH_SHORT).show()
                binding.pbLoding.visibility = View.INVISIBLE

            }

            override fun onDataChange(snapshot: DataSnapshot) {
                mCandidate.clear()
                for (teacherSnapshot in snapshot.children){
                    val upload = teacherSnapshot.getValue(Candidate::class.java)
                    upload!!.key = teacherSnapshot.key
                    mCandidate.add(upload)

                }
                listAdapter.notifyDataSetChanged()
                binding.pbLoding.visibility = View.GONE

            }

        })
    }

    override fun onDestroy() {
        super.onDestroy()
        mDatabaseRef!!.removeEventListener(mDBListener!!)
    }

}

我的数据库 只是搜索了很多问题,但不符合我的要求,请帮我解决这些问题。

标签: androidfirebasekotlinfirebase-realtime-database

解决方案


您当前存储的格式dob不允许搜索年份。您可以使用当前格式搜索 20 日出生的每个人:

mDatabaseRef = FirebaseDatabase.getInstance().getReference("candidate_upload")
Query query = mDatabaseRef.orderByChild("dob").startAt("20/").endAt("20~")
mDBListener = query.addValueEventListener(object : ValueEventListener{

现在这当然不是一个非常常见的用例,但不幸的是 Firebase 只有这些startAtendAt类型操作。

所以诀窍是以允许查询的格式存储您的日期:

"dob": "2002-04-20"

这是ISO 8601 格式,可以更轻松地处理日期。例如,我们现在可以查询 2002 年出生的每个人:

Query query = mDatabaseRef.orderByChild("dob").startAt("2002/").endAt("2002~")

~就是上面不是 Firebase 的操作符,而只是最后一个可打印的 ASCII 字符。


推荐阅读