Android Firebase:子节点子值匹配查询及用户邮箱查询改写
嗨,我来帮你搞定这两个Firebase Realtime Database的查询问题~
问题1:通过子节点的子节点字符串匹配查找对应子节点
首先得理清楚你的数据结构,看起来你是想在Users节点下的每个用户条目里,匹配service/serviceName这个嵌套子节点的字符串(前缀匹配)。你原来的代码里有个小问题:mUserDatabase.child("service")会把查询定位到Users/service这个节点,而不是遍历所有用户节点。
正确的做法是直接在Users节点上使用点路径(parent/child)来指向嵌套的子节点,这样Firebase就能遍历所有用户,针对每个用户的service/serviceName做过滤。修正后的代码如下:
private static DatabaseReference mUserDatabase = FirebaseDatabase.getInstance().getReference("Users"); // 用点路径指向嵌套的serviceName,做前缀匹配 Query firebaseSearchQuery = mUserDatabase.orderByChild("service/serviceName") .startAt(searchText) .endAt(searchText + "\uf8ff"); FirebaseRecyclerAdapter<Workers, WorkerViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Workers, WorkerViewHolder>( Workers.class, R.layout.search_result_layout, WorkerViewHolder.class, firebaseSearchQuery ) { @Override protected void populateViewHolder(WorkerViewHolder viewHolder, Workers model, int position) { viewHolder.setDetails(model.getName(), model.getEmail()); } };
小提示
别忘了在Firebase控制台的数据库规则里给service/serviceName添加索引,不然查询可能性能不佳或者被拒绝:
{ "rules": { "Users": { ".indexOn": ["service/serviceName"] } } }
问题2:匹配子节点的子节点值(如hardware)查找用户邮箱
假设你的数据结构是每个用户节点下有类似service/type: "hardware"这样的嵌套子节点,要精确匹配这个值并获取用户邮箱,同样用点路径定位嵌套节点,搭配equalTo()做精确匹配即可。
示例代码如下:
private static DatabaseReference mUserDatabase = FirebaseDatabase.getInstance().getReference("Users"); // 精确匹配service/type等于"hardware"的用户 Query hardwareUsersQuery = mUserDatabase.orderByChild("service/type") .equalTo("hardware"); // 添加监听器获取结果 hardwareUsersQuery.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) { // 提取用户邮箱 String userEmail = userSnapshot.child("email").getValue(String.class); // 这里可以处理邮箱,比如打印、显示到UI等 Log.d("FirebaseQuery", "匹配到的用户邮箱:" + userEmail); } } @Override public void onCancelled(DatabaseError databaseError) { // 处理查询错误 Log.w("FirebaseQuery", "查询失败", databaseError.toException()); } });
如果你的嵌套路径不是service/type(比如是skills/hardware),只要把orderByChild的参数改成对应的点路径就行。同样记得给这个路径添加索引优化性能:
{ "rules": { "Users": { ".indexOn": ["service/type"] // 换成你的实际路径 } } }
内容的提问来源于stack exchange,提问作者MASYAM
相关产品推荐
相关产品推荐

