在Android Studio中使用Firebase实时数据库仅查询当前登录用户的联系人数据
解决只展示当前登录用户联系人的问题
嘿,你已经完成了最核心的铺垫工作——把用户UID和联系人数据关联存储,这一步非常关键!接下来只需要简单调整你的Firebase查询逻辑,就能轻松实现只展示当前登录用户自己的联系人啦。
第一步:调整Firebase查询语句
你提到的orderByChild和equalTo正是实现这个需求的关键,只需要把这两个方法添加到你的查询中,过滤出uid字段与当前登录用户UID匹配的数据即可。
修改后的加载RecyclerView的代码如下:
// 先获取当前登录用户实例,务必做非空判断,避免未登录时的空指针异常 FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser(); if (mUser != null) { String currentUserId = mUser.getUid(); // 构建带过滤条件的查询:只获取uid等于当前用户ID的联系人 FirebaseRecyclerOptions<model> options = new FirebaseRecyclerOptions.Builder<model>() .setQuery( FirebaseDatabase.getInstance().getReference().child("contacts") .orderByChild("uid") // 指定按数据库中的uid字段排序/过滤 .equalTo(currentUserId), // 只保留uid匹配当前用户ID的条目 model.class ) .build(); myadapter = new myadapter(options); recyclerView.setAdapter(myadapter); } else { // 处理用户未登录的场景,比如提示登录、隐藏RecyclerView等 Toast.makeText(getApplicationContext(), "请先登录查看联系人", Toast.LENGTH_SHORT).show(); }
第二步:补充数据库安全规则(重要!)
为了确保数据安全,避免其他用户通过非法手段获取不属于自己的联系人,一定要在Firebase控制台的实时数据库规则中添加权限校验:
{ "rules": { "contacts": { ".read": "auth != null && auth.uid == data.child('uid').val()", ".write": "auth != null && auth.uid == newData.child('uid').val()" } } }
这个规则的意思是:
- 只有已登录的用户,且要读取的联系人数据中的
uid等于自己的用户ID时,才能读取该数据 - 只有已登录的用户,且要写入的联系人数据中的
uid等于自己的用户ID时,才能写入数据
原理说明
orderByChild("uid"):告诉Firebase实时数据库按照contacts节点下每条数据的uid字段进行排序equalTo(currentUserId):进一步筛选出uid字段值与当前登录用户UID完全匹配的条目,这样返回的结果就只有当前用户添加的联系人了
这样调整后,你的RecyclerView就只会加载并展示当前登录用户自己添加的联系人数据啦!
内容的提问来源于stack exchange,提问作者Zain08
相关产品推荐
相关产品推荐

