如何检查Firebase数据类中是否已存在值Anroid

问题描述:

我想检查Firebase数据库中是否存在总线编号。如何检查Firebase数据类中是否已存在值Anroid

这是我的示例代码。我一直在寻找过去的日子,但我找不到合适的代码来这样做。

ref = new Firebase(Config.FIREBASE_URL); 
      postRef = ref.child("BusNumber"); 

      busNum = edtBus.getText().toString().trim(); 
      route1 = route.trim(); 
      seat = edtSeat.getText().toString().trim(); 

      if (!busNum.isEmpty() && !route1.isEmpty() && !seat.isEmpty()) { 
       postRef.addListenerForSingleValueEvent(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         if (dataSnapshot.child(busNum).exists()) { 
          edtBus.setError("Bus number already exists."); 
          edtBus.setText(""); 
         } else { 
          busNumber = new BusNumber(); 
          busNumber.setBusNum(busNum); 
          busNumber.setRoute(route1); 
          busNumber.setNumSeat(seat); 
          postRef.push().setValue(busNumber); 
          edtBus.setText(""); 
          edtSeat.setText(""); 
          Toast.makeText(AddBusActivity.this, "Saving successful!", Toast.LENGTH_SHORT).show(); 
         } 
        } 

        @Override 
        public void onCancelled(FirebaseError firebaseError) { 
         Toast.makeText(AddBusActivity.this, "Error", Toast.LENGTH_SHORT).show(); 
         Toast.makeText(AddBusActivity.this, firebaseError.getMessage(), Toast.LENGTH_SHORT).show(); 
        } 
       }); 

      } else { 
       Toast.makeText(AddBusActivity.this, "Please complete the information", Toast.LENGTH_SHORT).show(); 
      } 

有人可以帮我解决这个问题吗?提前致谢。 if语句是否正确,我的问题是为什么postRef.addListenerForSingleValueEvent ...不起作用?我试图测试一些吐司消息,但消息不会弹出。

here is my firebase database

+0

您是否有任何Firebase规则设置阻止您阅读数据库?也许在onCanceled中添加一个日志,并打印出Firebase错误(如果有的话)。 – Linxy

+0

@linxy是的,我已经做到了。但据我记忆。没有错误 – tin

+0

您是否找到了解决方案? – silverFoxA

你的做法是错误的。

当你这样做时dataSnapshot.child(busNum).exists(),它正在关键部分寻找busNum,你的钥匙是-kasajdh...

因此,你可以做的是,让itrable,现在当你看 data.child(busNum).exists()它涉及到价值

postRef.addListenerForSingleValueEvent(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
       for(DataSnapshot data: dataSnapshot.getChildren()){ 
        if (data.child(busNum).exists()) { 
         //do ur stuff 
        } else { 
         //do something 
        } 
        } 
       } 

       @Override 
       public void onCancelled(FirebaseError firebaseError) { 

       } 
      }); 

dataSnapshot.child(busNum).getValue() != null 

应该工作。

+0

但它不起作用。即使我尝试在onDataChange方法内部烘烤一些消息,也不会弹出消息。 – tin

+0

查看您的Firebase身份验证规则吗?规则可能会阻止你这样做。 –

+0

但我没有创建一个新用户。它存储在数据库中。我还需要检查我的授权规则吗? – tin

难以猜测问题,因为您没有说明busNumbusNumber是如何定义和管理的。是busNumber一个字符串?

push()创建对自动生成的子位置的引用。自动生成的密钥看起来像-KPB_cS74yoDaKkM9CNB

声明postRef.push().setValue(busNumber)存储值busNumber在位置BusNumber/<push-generated-key>

声明dataSnapshot.child(busNum).exists()测试位置BusNumber/<busNum>处是否存在值。除非busNum是由push()创建的密钥之一,否则它不会成立。

目前尚不清楚您希望数据结构如何。如果您的公交车号码是字符串并且是唯一的,则不需要使用push()生成密钥。你可以使用存储总线号的存在:

postRef.child(busNumber).setValue(true)

+0

我不明白为什么我需要setValue(true)..我想要做的就是检查数据库中是否已经存在总线编号。因为如果总线号码存在,它会提示,但如果没有,它会在数据库中创建一组新的总线 – tin

+0

@tin:是'busNumber'是一个字符串吗? –

+0

是的,先生! 'busNumber'是一个字符串 – tin

而不是获取数据的整个迭代列表,您可以查询准确进入。

postRef = FirebaseDatabase.getInstance().getReference().child("BusNumber"); 

    postRef.orderByChild("busNum").equalTo(busNum) 
     .addListenerForSingleValueEvent(new ValueEventListener() { 

      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       if(dataSnapshot.exists()){ 
        //bus number exists in Database 
      } else { 
       //bus number doesn't exists. 
      } 

      @Override 
      public void onCancelled(FirebaseError firebaseError) { 

      } 
     });