2016-08-15 10 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>に値が存在するかどうかをテストします。 がpush()によって作成された鍵の1つでない限り、それは当てはまりません。

データをどのように構造化したいかは不明です。バス番号が文字列で一意である場合、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) { 

      } 
     }); 
関連する問題