2016-08-15 143 views
4

我想檢查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

回答

3

你的做法是錯誤的。

當你這樣做時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) { 

       } 
      }); 
3
dataSnapshot.child(busNum).getValue() != null 

應該工作。

+0

但它不起作用。即使我嘗試在onDataChange方法內部烘烤一些消息,也不會彈出消息。 – tin

+0

查看您的Firebase身份驗證規則嗎?規則可能會阻止你這樣做。 –

+0

但我沒有創建一個新用戶。它存儲在數據庫中。我還需要檢查我的授權規則嗎? – tin

0

難以猜測問題,因爲您沒有說明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

0

而不是獲取數據的整個迭代列表,您可以查詢準確進入。

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) { 

      } 
     }); 
相關問題