【问题标题】:How to check if sub child exists in Firebase Realtime Database?如何检查 Firebase 实时数据库中是否存在子子项?
【发布时间】:2021-10-16 01:27:15
【问题描述】:

我的主节点Employees有3个值:Mob。没有,UserPIN 和 empID。我需要检查我的一项活动,以确定输入的 UserPIN 是否存在于 thos 节点下。我无法通过以下方式做到这一点:

if(datasnapshot.child(enteredUserPIN).exists(){
}

在检查 Mob 时,我也无法更改节点布局。不。以及在另一项活动中。另外,我不能直接给出路径,直到暴徒。不。 请指导。

员工节点:

编辑

我的代码:

private void mpinexists(){
    Log.d("abcd","mpinexists() reached");
    checkmPINRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot ds:dataSnapshot.getChildren()){
                if(ds.child(enteredmPIN).exists()){
                    Toast.makeText(getActivity(),"mPIN already exists",Toast.LENGTH_SHORT).show();
                    Log.d("abcd","mpin already exists");

                }
                else{
                    Log.d("abcd","mpin doesn't exists");
                    Toast.makeText(getActivity(),"mPIN doesn't exists",Toast.LENGTH_SHORT).show();
                }
            }
}

我的日志:

04-25 21:53:28.889 10147-10147/com.example.abcd.efg D/abcd: mpinexists() reached
04-25 21:53:31.471 10147-10147/com.example.abcd.efg D/abcd: mpin already exists
04-25 21:53:31.472 10147-10147/com.example.abcd.efg D/abcd: mpin doesn't exists

【问题讨论】:

  • 问题解决了吗?
  • @AlexMamo 否...我暂时在表中创建了另一个密钥作为 UserPIN 并再次存储了 UserPIN,还有其他方法吗?
  • 是的。所以如果我给你写另一个解决方案会对你有帮助吗?
  • @AlexMamo 是的,请

标签: java android firebase firebase-realtime-database


【解决方案1】:

为了解决这个问题,您需要在DataSnapshot 对象上使用Queryexists() 方法,如下所示:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef
    .child("Employees")
    .child(mobileNumber) //Could be: 765432189
    .child(userPin) //Could be: 123457
    .orderBychild("empid")
    .equalsTo(enteredUserPIN);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if(dataSnapshot.exists()) {
            //Do something
        } else {
            //Do something else
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
query.addListenerForSingleValueEvent(valueEventListener);

根据您的编辑,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference employeesRef = rootRef.child("Employees");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            if(ds.child(enteredUserPIN).exists()) {
                //Do something
            } else {
                //Do something else
            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
employeesRef.addListenerForSingleValueEvent(valueEventListener);

【讨论】:

  • 哦,好吧,但我需要在不知道 mobileNumber 的情况下检查 UserPIN。这就像我只想遍历整个表,看看是否有任何数据匹配。
  • 好吧,你不知道手机号码,但你知道userPin吗?比如说123457?
  • 是的,我需要查看给定的 userPin 是否存在
  • 有些东西我不明白。你需要检查empid的值是否等于enteredUserPIN或者你想检查userPin,可以是123457是否存在?
  • 第二个,我需要检查当用户输入一个UserPin时,它是否存在于表中
【解决方案2】:

如果您无法更改当前表格布局。您应该创建一个单独的节点,您只需将所有引脚作为键值对,例如 Pin 作为键和 true 作为值。您可以在那里检查引脚是否存在

【讨论】:

  • 别无他法? ://
  • 嗯,这是最直接的方法,这也是人们通常所做的。因此,通过这种方式,您的响应会更快,因为您可以在知道 pin 后直接访问孩子并检查是否存在,而无需访问任何不必要的检查。
  • 没关系,但我想知道我的知识,是否有任何方法可以以我想要的方式检查子孩子?
【解决方案3】:
ValueEventListener listener = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            if (snapshot.hasChildren()) {
                Toast.makeText(getApplicationContext(), "hasChildren ", Toast.LENGTH_SHORT).show();
                getDesigns();
            }
            else {
                Toast.makeText(getApplicationContext(), "No Data", Toast.LENGTH_SHORT).show();
                loadingPB.setVisibility(View.GONE);
            }
        }
        @Override
        public void onCancelled(@NonNull DatabaseError error) {

        }
    };
    databaseReference.addListenerForSingleValueEvent(listener);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 2018-09-14
    相关资源
    最近更新 更多