2017-02-11 28 views
-1

ノードが使用可能かどうかをチェックする機能があります。ここFirebase:ノードが存在するかどうかの確認

public class Utilities { 
    static boolean availability; 
    static FirebaseDatabase fireDb = FirebaseDatabase.getInstance(); 
    static DatabaseReference dbRef1; 
    private static boolean checkAvailability(String ID) { 
     /**check in firebase if the generated ID exists. if it exists return false, else return true**/ 
     final String id = ID; 
     availability = true; 

      dbRef1 = fireDb.getReference("xdsdads"); 
      dbRef1.addListenerForSingleValueEvent(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        try { 
         if (dataSnapshot.hasChild(id) || dataSnapshot.hasChild("Room:" + id)) { 
          Log.d("key", "Key exists!"); 
          availability = false; 
         } else { 
          availability = true; 
         } 
        } catch (Exception e) { 
         Log.d("Error", "error getting key" + e.toString()); 
        } 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 

       } 
      }); 
     Log.d("Availability","" + availability); 
     return availability; 

    } 


    public static String generateID() { 
     /**generates ID **/ 
     String ID = ""; 
     Random random = new Random(); 
     for (int i = 0; i < 8; i++) { 
      if (i < 4) { 
       ID = ID + giveAlphabet(random.nextInt(26)); 
      } else { 
       ID = ID + random.nextInt(9); 
      } 
     } 
     Log.d("ID",ID); 

     if (checkAvailability(ID)) { 
      return ID; 
     } else { 
      return generateID(); 
     } 
    } 

    public static String giveAlphabet(int i) { 
     /**returns an alphabet from A-Z**/ 
     String[] alphabet = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}; 
     String output = ""; 
     try { 
      if (i >= 0 && i < 26) { 
       output = alphabet[i]; 
      } else { 
       throw new Exception("Value not between 0-26 cannot generate Alphabet"); 
      } 
     } catch (Exception e) { 
      Log.d("Exception at Beacon", e.toString()); 
     } 
     return output; 
    } 

を次のように関数である私のJSON

{ 
    "PKWC1865" : "77.6709266,12.8541147", 
    "QKAR6584" : "79.6944701,11.1072002", 
    "Room:ANWE3226" : { 
    "FREESLOTS" : "2,3,4", 
    "USER1" : "BC:QKAR6584", 
    "USER2" : "NONE", 
    "USER3" : "NONE", 
    "USER4" : "NONE" 
    } 
} 

sampledbは、私のルートです。引数IDがdbに存在するかどうかを確認しています。しかし、onDataChangeメソッドは決して呼び出されません。したがって、与えられたノードが存在するかどうかは決して確認できませんでした。

+0

このメソッドは常にtrueを返します。コールバックインタフェースを作成し、メソッドの引数として渡す必要があります。 – Linxy

+0

変数「availability」がグローバルである場合、 –

+0

よくgenerateIDはIDが存在するかどうかを考慮せず、真で瞬時に戻ります。 – Linxy

答えて

0

非同期パターンと同期を混同しています。あなたの関数はFirebaseにデータを呼び出しますが、答えが出る直前に戻ります。 Firebaseはネットワークを呼び出してデータを取得する必要があり、これには時間がかかります。答えが到着すると、既に値を返そうとしているので、遅すぎます。

あなたの行う必要があるのは、関数が追加パラメータとしてコールバックを取ることです。データが到着したら、その値でこのコールバックを呼び出します。これを行うには、ほとんどの場合、最初の呼び出し方法を書き直す必要があります。ここで同期動作を期待する上流ロジックを設計した場合、その上流ロジックも非同期動作を許容するように変更する必要があります。

関連する問題