2017-02-22 21 views
1

Я использую базу данных firebase и вам нужно создать уникальный дочерний узел в базе данных, чтобы начать чат One-One. Я звоню FireBaseDatabase.updateChildren(RoomName), чтобы установить одноместный номер для 2 пользователей.OnDataChange никогда не называется базой данных FIrebase

Я имею вопрос в призыве FireBaseDatabase.addListenerForSingleValueEvent(new ValueEventListener()

и под этим Слушатель ни один из вызовов метода даже не на public void onCancelled(DatabaseError databaseError)

Вот мой код

fab.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Snackbar.make(view, "Hello I am SnackBar", Snackbar.LENGTH_LONG).setAction("Action", null).show(); 
     Log.d(TAG, "User Session Value " + userSession); 
     userSession = new UserSession(getActivity(), "Pref_FileName"); 
     Log.d(TAG, "User Session Value After Init " + userSession); 
     final Map<String, Object> RoomName = new HashMap<>(); 
     RoomTitle = userSession.getPhoneNO() + "-" + UserData.getPhone(); 
     otherUserRoom = UserData.getPhone() + "-" + userSession.getPhoneNO(); 
     Log.d(TAG, "Room Title Should Be " + RoomTitle); 


     DatabaseReference FireBaseDatabase = FirebaseDatabase.getInstance().getReference(); 



     Log.d(TAG, "Chat room name from Database " + db.toString()); //GETTING THIS VALUE IN LOG 

     FireBaseDatabase.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       if (dataSnapshot.hasChild(RoomTitle)) { 
        intent2.putExtra("Get_Other",RoomTitle); 
        Log.d(TAG,"Room Exists No Need To Create It "+RoomTitle); // THIS LOG NEVER GENERATE 
        RoomNameFinal=RoomTitle; 

       } 
       else if (dataSnapshot.hasChild(otherUserRoom)){ 
        intent2.putExtra("Get_Other",otherUserRoom); 
        Log.d(TAG,"Room Exists No Need To Create It "+otherUserRoom);// THIS LOG NEVER GENERATE 
        RoomNameFinal=otherUserRoom; 


       } 

       else { 
        Log.d(TAG,"None Of the above Room exist so Create one with RoomTitle "+RoomName);// THIS LOG NEVER GENERATE 
        intent2.putExtra("Get_Other",RoomTitle); 
        RoomName.put(RoomTitle, ""); 
        FireBaseDatabase.updateChildren(RoomName); 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       Log.d(TAG,"On Cancelled Calling "+databaseError.getDetails()); // THIS LOG NEVER GENERATE 
       Log.d(TAG,"On Cancelled Calling "+databaseError.getMessage()); // THIS LOG NEVER GENERATE 
       Log.d(TAG,"On Cancelled Calling "+databaseError.toString()); // THIS LOG NEVER GENERATE 

      } 


     }); 



     intent2.putExtra("Get_Phone", UserData.getPhone()); 
     intent2.putExtra("Get_Image", UserData.getImage()); 
     intent2.putExtra("Get_Name", UserData.getName()); 
     Log.d(TAG,"Room Name Final "+RoomNameFinal); 
     startActivity(intent2); 

    } 
}); 

Edit: Где я добавляю ребенка в моей базе данных Firebase enter image description here

ответ

0

Я решил сделать некоторые изменения в коде. Я не уверен, почему это произошло, но для тех, кто все еще придерживался этой проблемы, мало поможет. Вместо вызова FireBaseDatabase.updateChildren(RoomName) из непосредственно в onDataChange я создать метод, который будет вызываться из onDataChange

fab.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Snackbar.make(view, "Hello I am SnackBar", Snackbar.LENGTH_LONG).setAction("Action", null).show(); 
     Log.d(TAG, "User Session Value " + userSession); 
     userSession = new UserSession(getActivity(), "Pref_File"); 

     RoomName = new HashMap<>(); 
     RoomTitle = userSession.getPhoneNO() + "-" + UserData.getPhone(); 
     otherUserRoom = UserData.getPhone() + "-" + userSession.getPhoneNO(); 
     Log.d(TAG, "Room Title Should Be " + RoomTitle); 


     DatabaseReference db = FirebaseDatabase.getInstance().getReference(); 



     Log.d(TAG, "Chat room name from Database " + db.toString()); 


     db.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 

      public void onDataChange(DataSnapshot dataSnapshot) { 
       Log.d(TAG,"On Data Change Calling "+dataSnapshot); 
       if (dataSnapshot.hasChild(RoomTitle)) { 
        Log.d(TAG,"Room Exists No Need To Create It 1"+RoomTitle); 
        RoomName(RoomTitle,false); 

       } 
       else if (dataSnapshot.hasChild(otherUserRoom)){ 
        Log.d(TAG,"Room Exists No Need To Create It 2 "+otherUserRoom); 

        RoomName(otherUserRoom,false); 

       } 
       else { 
        Log.d(TAG,"None Of the above Room exist so Create one with RoomTitle "+RoomName); 
        RoomName(RoomTitle,true); 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       Log.d(TAG,"On Cancelled Calling "+databaseError.getDetails()); 
       Log.d(TAG,"On Cancelled Calling "+databaseError.getMessage()); 
       Log.d(TAG,"On Cancelled Calling "+databaseError.toString()); 

      } 


     }); 

Этот метод я создал для вызова FireBaseDatabase.updateChildren(RoomName), не вызывая от If Else Заявление моего предыдущего кода.

public void RoomName (String Name,boolean RoomExist){ 

    if (RoomExist){ 
     Log.d(TAG,"Room Not Exist Creating One in METHOD NAME ROOM NAME "+RoomExist); 
     RoomName.put(Name, ""); 
     FireBaseDatabase.updateChildren(RoomName); 
    } 

    Log.d(TAG,"Method ROOM NAME CALLING Value Of ROOM NAME FINAL "+Name); 
    intent = new Intent(getActivity(), Chat_Screen.class); 
    intent.putExtra("Get_Phone", UserData.getPhone()); 
    intent.putExtra("Get_Image", UserData.getImage()); 
    intent.putExtra("Get_Name", UserData.getName()); 
    intent.putExtra("Get_Other",Name); 
    startActivity(intent); 
} 

Теперь мой onDataChange вызов, как я want.I надеюсь, что это будет кто-то, кто имеет такой же вопрос.

0

Вы просто забудете ind введите имя вашей базы данных в функции getReference().

Например, если вы хотите получать сообщения объекты, которые нужно установить DatabaseReference с чем-то вроде

DatabaseReference myRef = database.getReference("message"); 

И URL-адрес моей базы данных выглядит следующим образом:

https://myproject.firebaseio.com/message

Этот url указывает на вкладку RealTimeDatabase на панели управления Firebase.

Надеюсь, что эта помощь.

+0

Я добавляю ребенка в корень, когда onDatachanged вызывается так, что до этого нет ни одного ребенка, я имею в виду root. 'FirebaseDatabaseFirebaseDatabase.getInstance(). GetReference();' return to root, и я добавляю комнату в корневой каталог – androidXP

+0

. Посмотрите изображение выше, чтобы узнать, как мои узлы выглядят в FirebaseDatabase. – androidXP

+0

. Попробуйте эту базу данных DatabaseReferenceReference = FirebaseDatabase.getInstance(). GetReference() .getRoot(); –