Firebase查询特定userId关联手环数据,Kotlin实现Android RecyclerView展示
问题描述
我在Firebase Realtime Database中有如下结构,其中pairs节点的子节点键采用braceletid-userid的格式,用来关联手环和用户:
{ "bracelets": { "12345": { "braceletID": 12345, "braceletName": "m1", "latitude": 21.42, "longitude": 22.827237 }, "4545": { "braceletID": 4545, "braceletName": "m3", "latitude": 21.421189, "longitude": 22.827237 } }, "pairs": { "12345-xfdftt56454": { "braceletID": "12345", "braceletName": "m1", "userId": "xfdftt56454" }, "4545-5W2lRzan1": { "braceletID": "4545", "braceletName": "m3", "userId": "5W2lRzan1" } }, "users": { "xfdftt56454": { "name": "h", "phone": "0555", "uid": "xfdftt56454" }, "5W2lRzan1": { "name": "m", "phone": "013242", "uid": "5W2lRzan1" } } }
需要实现:在Android端用Kotlin编写代码,查询pairs节点中所有包含特定userId(比如xfdftt56454)的子节点,提取braceletID和braceletName,并将手环名称填充到RecyclerView列表中。
解决方案
1. 创建数据模型类
定义数据类映射pairs节点的结构:
data class BraceletPair( val braceletID: String? = null, val braceletName: String? = null, val userId: String? = null )
2. Firebase查询逻辑
通过Firebase API筛选指定userId的配对数据:
import com.google.firebase.database.DatabaseReference import com.google.firebase.database.FirebaseDatabase import com.google.firebase.database.Query // 获取数据库引用 val dbRef: DatabaseReference = FirebaseDatabase.getInstance().reference // 构建查询:筛选pairs中userId匹配目标值的条目 fun getBraceletsForUser(targetUserId: String): Query { return dbRef.child("pairs").orderByChild("userId").equalTo(targetUserId) }
3. RecyclerView适配器
编写适配器绑定手环名称到列表项:
import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView class BraceletAdapter(private val braceletNames: List<String>) : RecyclerView.Adapter<BraceletAdapter.BraceletViewHolder>() { inner class BraceletViewHolder(val binding: ItemBraceletBinding) : RecyclerView.ViewHolder(binding.root) override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BraceletViewHolder { val binding = ItemBraceletBinding.inflate( LayoutInflater.from(parent.context), parent, false ) return BraceletViewHolder(binding) } override fun onBindViewHolder(holder: BraceletViewHolder, position: Int) { holder.binding.tvBraceletName.text = braceletNames[position] } override fun getItemCount(): Int { return braceletNames.size } }
注:需提前启用View Binding,列表项布局item_bracelet.xml需包含id为tvBraceletName的TextView用于显示名称。
4. 界面整合代码
在Activity/Fragment中初始化RecyclerView并执行查询:
import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.LinearLayoutManager import com.google.firebase.database.DataSnapshot import com.google.firebase.database.DatabaseError import com.google.firebase.database.ValueEventListener class BraceletListActivity : AppCompatActivity() { private lateinit var adapter: BraceletAdapter private val braceletNames = mutableListOf<String>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_bracelet_list) // 初始化RecyclerView val recyclerView = findViewById<RecyclerView>(R.id.rvBracelets) recyclerView.layoutManager = LinearLayoutManager(this) adapter = BraceletAdapter(braceletNames) recyclerView.adapter = adapter // 目标用户ID,可根据实际场景传入 val targetUserId = "xfdftt56454" val query = getBraceletsForUser(targetUserId) // 监听数据变化并更新列表 query.addValueEventListener(object : ValueEventListener { override fun onDataChange(snapshot: DataSnapshot) { braceletNames.clear() snapshot.children.forEach { pairSnapshot -> val pair = pairSnapshot.getValue(BraceletPair::class.java) pair?.braceletName?.let { braceletNames.add(it) } } adapter.notifyDataSetChanged() } override fun onCancelled(error: DatabaseError) { error.toException().printStackTrace() } }) } }
注意事项
- 确保项目已配置Firebase Realtime Database依赖,并添加
INTERNET权限。 - 若只需单次查询,可替换
addValueEventListener为addListenerForSingleValueEvent。 - 数据类字段名需与Firebase节点键完全一致,否则映射失败。
内容的提问来源于stack exchange,提问作者coder 534
相关产品推荐
相关产品推荐

