2017-02-22 7 views
1

私はfirebaseデータベースを使用しており、1対1のチャットを開始するためにデータベースに一意の子ノードを作成する必要があります。私はFireBaseDatabase.updateChildren(RoomName)に2人のユーザーのためのシングルルームを設定するように呼びます。OnDataChangeはFIREbaseデータベースを呼び出すことはありません

私は FireBaseDatabase.addListenerForSingleValueEvent(new ValueEventListener()

を呼び出すことにし、方法のこのリスナーのどれも私のコードを編集

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

    } 
}); 

である。ここでもpublic void onCancelled(DatabaseError databaseError)

にない呼び出していない下の問題を抱えてい

:私は子を追加してい私のFirebaseデータベース内 enter image description here

答えて

0

私はコードでいくつか編集して解決しました。なぜこれが起こったのか分かりませんが、まだこの問題に取り組んでいない人にとっては、これはほとんど役に立たないでしょう。代わりにonDataChangeに直接からFireBaseDatabase.updateChildren(RoomName)を呼び出すので、私は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()); 

      } 


     }); 

私は私の以前のコードの場合はelse文から呼び出しされていないFireBaseDatabase.updateChildren(RoomName)を呼び出すために作成したこのメソッドから呼び出されるメソッドを作成します。私はそれが問題の同じ種類を持っている人を願っていますwant.Iとして

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コール。

0

あなたはind関数getReference()にデータベース参照の名前を入力します。

あなたがメッセージを取得したい場合たとえば、あなたが

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

ようなものでDatabaseReferenceを設定する必要があるオブジェクトと私のデータベースのURLは次のようになります。

https://myproject.firebaseio.com/message

このurlはFirebaseダッシュボードのRealTimeDatabaseタブの上部に表示されます。

このヘルプが必要です。

+0

onDatachangedがこれを呼び出す前に子を追加しようとしていますが、これは子供がいないため、私はrootを参照しています。 (FirebaseDatabaseFirebaseDatabase.getInstance()。getReference(); 'ルートに戻り、私はルートに部屋を追加しています – androidXP

+0

ノードをFirebaseDatabaseでどのように見ているかを知るには上記の画像をチェックしてください。 – androidXP

+0

このDatabaseReferenceを試してくださいdatabaseReference = FirebaseDatabase.getInstance()。getReference .getRoot(); –

関連する問題