2017-04-24 65 views
0

我正在開發一個使用Firebase作爲後端服務器的基於android的應用程序。我設計了應用程序的結構以下列方式:代碼不會超出Firebase數據庫子事件偵聽器錯誤

Project Name 
|_ Products 
|_ groups 
    |_ 1BME 
     |_ members 
     |_ -K4usWDhtiw4U 
      |_ Custom Object 
     |_ -K4uscDHwYsXHs 
      |_ Custom Object 

自定義對象是:

package com.app.shubhamjhunjhunwala.heritagecompanion_students; 

import android.net.Uri; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v7.app.AppCompatActivity; 

/** 
* Created by shubham on 23/01/17. 
*/ 

public class UserDetails { 

    UserDetails() {} 

    public String name; 
    public String email; 
    public String password; 
    public String phone; 
    public String roll; 
    public String department; 
    public String year; 
    public String section; 
    public String dpDownloadUri; 

    public UserDetails(String name, String email, String password, String phone, String roll, String department, String year, String section, String dpDownloadUri) { 
     this.name = name; 
     this.email = email; 
     this.password = password; 
     this.phone = phone; 
     this.roll = roll; 
     this.department = department; 
     this.year = year; 
     this.section = section; 
     this.dpDownloadUri = dpDownloadUri; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public String getPhone() { 
     return phone; 
    } 

    public void setPhone(String phone) { 
     this.phone = phone; 
    } 

    public String getRoll() { 
     return roll; 
    } 

    public void setRoll(String roll) { 
     this.roll = roll; 
    } 

    public String getDepartment() { 
     return department; 
    } 

    public void setDepartment(String department) { 
     this.department = department; 
    } 

    public String getYear() { 
     return year; 
    } 

    public void setYear(String year) { 
     this.year = year; 
    } 

    public String getSection() { 
     return section; 
    } 

    public void setSection(String section) { 
     this.section = section; 
    } 

    public String getDpDownloadUri() { 
     return dpDownloadUri; 
    } 

    public void setDpDownloadUri(String dpDownloadUri) { 
     this.dpDownloadUri = dpDownloadUri; 
    } 
} 

我的目的是讓下組的孩子1BME下下成員的孩子的用戶詳細信息。因此,對於這一點,我用下面的代碼在我的程序:

mDatabase = FirebaseDatabase.getInstance(); 
mGroupMembersDatabaseReference = mDatabase.getReference().child("groups").child(groupRoll).child("members"); 

mGroupMembersDatabaseReference.addChildEventListener(new ChildEventListener() { 
         @Override 
         public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
          UserDetails users = dataSnapshot.getValue(UserDetails.class); 

          Toast.makeText(GroupChatActivity.this, users.getRoll(), Toast.LENGTH_SHORT).show(); 

          if (!users.getRoll().equals(senderRoll)) { 

           Toast.makeText(GroupChatActivity.this, users.getName(), Toast.LENGTH_SHORT).show(); 

           mRecieverDatabaseReference = mRecieverDatabaseReference.child(users.getRoll()).child("groups").child(groupRoll); 

           Query query1 = mRecieverDatabaseReference.orderByChild("roll").equalTo(groupRoll); 
           query1.addListenerForSingleValueEvent(new ValueEventListener() { 
            @Override 
            public void onDataChange(DataSnapshot dataSnapshot) { 
             for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) { 
              dataSnapshot1.getRef().child("state").setValue("unread"); 
              dataSnapshot1.getRef().child("timeID").setValue(timeID); 
             } 
            } 

            @Override 
            public void onCancelled(DatabaseError databaseError) { 

            } 
           }); 

           Messages message = new Messages(messageText, time, senderRoll, name, chatName, groupRoll, mState, messageType, ""); 
           mRecieverDatabaseReference.push().setValue(message); 

           mRecieverDatabaseReference = mDatabase.getReference().child("chats"); 
          } 
         } 

         @Override 
         public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

         } 

         @Override 
         public void onChildRemoved(DataSnapshot dataSnapshot) { 

         } 

         @Override 
         public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

         } 

         @Override 
         public void onCancelled(DatabaseError databaseError) { 

         } 
        }); 

在這段代碼字符串groupRoll = "1BME"

但是當我運行這段代碼並調試它,我覺得它永遠不會進入onChildAdded()。所以請幫助我。因爲這個應用程序沒有前進。

謝謝。

+0

沒有開始,項目名稱爲根這樣mDatabase.getReference()子( 「項目名稱」)。子女( 「集團」)的母公司。孩子(groupRoll)。子( 「成員」); – sai

+0

我已經使用了很多查詢的應用程序。他們都工作。但是我沒有使用.Child(「項目名稱」)。所以它基本上被忽視了。你有其他解決方案嗎? –

回答

0

首先你的DatabaseReference是錯的。爲了從成員中獲取數據,請使用此代碼:

mGroupMembersDatabaseReference = mDatabase.getReference().child("groups").child(groupRoll).child("members").child(memberId); 

其中memberId是由push()方法生成的唯一的ID。

其次,您不需要使用addListenerForSingleValueEvent來更改值。在DataSnapshot上使用setValue()方法是錯誤的。您可以直接在reference上使用setValue()。希望能幫助到你。

+0

感謝您的回答。這是告訴你,你所建議的只是爲一個用戶獲取用戶詳細信息。我希望獲得集團1BME所有成員的用戶詳細信息。所以請儘量幫助我 –

+0

不,我的建議是讓所有用戶。因爲'memberId'是一個變量,當你循環時,這個變量'memberId'成爲每個成員。如果我建議你用'memberId'代替某個特定的ID,比如說'-K4usWDhtiw4U',那麼它會代表特定的成員。 –

0

試試這個

for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 
    UserDetails users = snapshot.getValue(UserDetails.class); 
    //... 
}