2017-02-11 3 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 мой корень. Я проверяю, присутствует ли идентификатор аргумента в db или нет. Но метод onDataChange никогда не вызывается. и, следовательно, я никогда не мог проверить, присутствует ли данный узел или нет.

+0

Этот метод всегда будет возвращать true. Вы должны сделать интерфейс обратного вызова и передать его в качестве аргумента в свой метод. – Linxy

+0

переменная «доступность» является глобальной, –

+0

Изначально generateID не учитывает, существует ли ваш идентификатор, так как он немедленно вернется с true. – Linxy

ответ

0

Вы вводите в заблуждение синхронно с асинхронными шаблонами. Ваша функция вызовет Firebase для данных, но затем вернется сразу же после ответа. Firebase должна вызывать сеть для получения данных, и это требует времени. Когда приходит ответ, слишком поздно, потому что вы уже пытались вернуть значение.

Что вам нужно сделать, так это чтобы ваша функция выполняла обратный вызов в качестве дополнительного параметра. Когда данные поступят, вызовите этот обратный вызов со значением. Для этого вам почти наверняка также потребуется переписать, как вы делаете вызов в первую очередь. Если вы разработали логику восходящего потока, чтобы ожидать здесь синхронной операции, эта логика восходящего потока также должна быть изменена, чтобы терпеть асинхронное поведение.

Смежные вопросы