如何在Android中的Firebase数据库中存储用户的ArrayList?

如何在Android中的Firebase数据库中存储用户的ArrayList?,android,firebase,arraylist,firebase-realtime-database,Android,Firebase,Arraylist,Firebase Realtime Database,我正在尝试制作一个拥有大量用户的应用程序。我所想到的是拥有和模型的大厅和它的属性之一将是一个ArrayList的用户。但从我目前所读到的来看,说起来容易做起来难。这就是我目前所拥有的 lobble.class(大厅模型) @包裹 公共课大厅{ 私人字符串所有者; 私有字符串位置; 私人双重成本; 私有字符串起始日期; 私人ArrayList成员; 公共大厅(){ } 公共大厅(字符串所有者、字符串位置、双重成本、字符串起始日期、ArrayList成员){ this.owner=所有者; 这个位置

我正在尝试制作一个拥有大量用户的应用程序。我所想到的是拥有和模型的大厅和它的属性之一将是一个ArrayList的用户。但从我目前所读到的来看,说起来容易做起来难。这就是我目前所拥有的

lobble.class(大厅模型)

@包裹
公共课大厅{
私人字符串所有者;
私有字符串位置;
私人双重成本;
私有字符串起始日期;
私人ArrayList成员;
公共大厅(){
}
公共大厅(字符串所有者、字符串位置、双重成本、字符串起始日期、ArrayList成员){
this.owner=所有者;
这个位置=位置;
成本=成本;
this.startDate=startDate;
这个.成员=成员;
}
公共字符串getOwner(){
归还所有人;
}
公共void集合所有者(字符串所有者){
this.owner=所有者;
}
公共字符串getLocation(){
返回位置;
}
公共void集合位置(字符串位置){
这个位置=位置;
}
公共成本{
退货成本;
}
公共成本(双倍成本){
成本=成本;
}
公共字符串getStartDate(){
返回起始日期;
}
公共无效设置开始日期(字符串开始日期){
this.startDate=startDate;
}
公共ArrayList getMembers(){
返回成员;
}
公共void集合成员(ArrayList成员){
这个.成员=成员;
}
公共字符串getDateText(){
String dateString=DateFormat.getDateInstance().format(新日期());
返回日期字符串;
}
public int getTotalMembers(){
返回成员。size();
}
}
这就是我把大厅保存到firebase的地方

public class createLobby extends AppCompatActivity {

private static String TAG = "CreateLobby";
private TextView displayDate;
private DatePickerDialog.OnDateSetListener dateListener;
private EditText locIn, costIn;
private FirebaseAuth firebaseAuth;
private DatabaseReference databaseReference;
private DatabaseReference usernameGet;
private Button submitLobbyButton;
private String ownerName;
FirebaseUser user;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_create_lobby);

    firebaseAuth = FirebaseAuth.getInstance();
    user = firebaseAuth.getCurrentUser();
    databaseReference = FirebaseDatabase.getInstance().getReference();
    usernameGet = databaseReference.child(user.getUid()).child("userName");

    usernameGet.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            ownerName = dataSnapshot.getValue(String.class);
            Log.v("Username", ownerName);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    locIn = (EditText)findViewById(R.id.loc_input);
    costIn = (EditText)findViewById(R.id.cost_input);

    displayDate = (TextView)findViewById(R.id.date_picker);

    displayDate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Calendar cal = Calendar.getInstance();
            int year = cal.get(Calendar.YEAR);
            int month = cal.get(Calendar.MONTH);
            int day = cal.get(Calendar.DAY_OF_MONTH);

            DatePickerDialog dialog = new DatePickerDialog(
                    createLobby.this, android.R.style.Theme_Holo_Light_Dialog_MinWidth,
                    dateListener, year, month, day);
            dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
            dialog.show();
        }
    });
    dateListener = new DatePickerDialog.OnDateSetListener() {
        @Override
        public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
            month = month+1;
            String date = month + "/" + dayOfMonth + "/" + year;
            displayDate.setText(date);
        }
    };
    submitLobbyButton = (Button)findViewById(R.id.create_lobby_button);
    submitLobbyButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            submitLobby();
        }
    });
}
public void submitLobby(){
    firebaseAuth = FirebaseAuth.getInstance();
    user = firebaseAuth.getCurrentUser();
    DatabaseReference lobbyRef = FirebaseDatabase.getInstance().getReference(Constants.LOBBIES);
    String owenerMan = ownerName;
    String gameLoc = locIn.getText().toString();
    Double gameCost = Double.parseDouble(costIn.getText().toString());
    String gameDate = displayDate.getText().toString();
    ArrayList<FirebaseUser> lobbyMembers = new ArrayList<>();
    Lobby newLobby = new Lobby(owenerMan, gameLoc, gameCost, gameDate, lobbyMembers);
    lobbyMembers.add(user);
    lobbyRef.push().setValue(newLobby);
    Log.v("creator", owenerMan);
    Log.v("newLobby", newLobby.getStartDate());
    Toast.makeText(getApplicationContext(), "Lobby Added!", Toast.LENGTH_SHORT).show();
}

}
公共类CreateLobble扩展AppCompative活动{
私有静态字符串TAG=“CreateLobble”;
私有文本视图显示日期;
私有DatePickerDialog.OnDateSetListener dateListener;
私人编辑文本locIn,costIn;
私有FirebaseAuth FirebaseAuth;
私有数据库参考数据库参考;
私有数据库引用usernameGet;
私有按钮submitLobbyButton;
私有字符串所有者名称;
FirebaseUser用户;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u create\u lobble);
firebaseAuth=firebaseAuth.getInstance();
user=firebaseAuth.getCurrentUser();
databaseReference=FirebaseDatabase.getInstance().getReference();
usernameGet=databaseReference.child(user.getUid()).child(“用户名”);
usernameGet.addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
ownerName=dataSnapshot.getValue(String.class);
Log.v(“用户名”,所有者名称);
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
locIn=(EditText)findViewById(R.id.loc_输入);
costIn=(EditText)findViewById(R.id.cost\u输入);
displayDate=(TextView)findViewById(R.id.date\u选择器);
displayDate.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
Calendar cal=Calendar.getInstance();
int year=cal.get(日历年);
int month=cal.get(日历月);
int day=cal.get(日历日/月日);
DatePickerDialog对话框=新建DatePickerDialog(
createLobby.this,android.R.style.Theme\u Holo\u Light\u Dialog\u MinWidth,
日期(年、月、日);
dialog.getWindow().setBackgroundDrawable(新的ColorDrawable(Color.TRANSPARENT));
dialog.show();
}
});
dateListener=新建DatePickerDialog.OnDateSetListener(){
@凌驾
public void onDateSet(日期选择器视图,整数年,整数月,整数天月){
月=月+1;
字符串日期=月+“/”+月天数+“/”+年;
displayDate.setText(日期);
}
};
submitLobbyButton=(按钮)findViewById(R.id.create\u lobby\u按钮);
submitLobbyButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
submitLobby();
}
});
}
公共无效提交人(){
firebaseAuth=firebaseAuth.getInstance();
user=firebaseAuth.getCurrentUser();
DatabaseReference LobberRef=FirebaseDatabase.getInstance().getReference(常量.LOBBIES);
字符串owenerMan=ownerName;
字符串gameLoc=locIn.getText().toString();
Double gameCost=Double.parseDouble(costIn.getText().toString());
字符串gameDate=displayDate.getText().toString();
ArrayList lobbyMembers=新建ArrayList();
大厅新大厅=新大厅(owenerMan、gameLoc、gameCost、gameDate、大厅成员);
添加(用户);
lobbyRef.push().setValue(newlobb);
Log.v(“创造者”,owenerMan);
Log.v(“newlobb”,newlobb.getStartDate());
Toast.makeText(getApplicationContext(),“添加了大厅!”,Toast.LENGTH\u SHORT.show();
}
}

运行代码时,会出现一个错误,指出lobble.class文件中的getTotalMembers()函数返回空指针异常。阵列不存储

请尝试更换此函数,然后告诉我发生了什么:

public void submitLobby(){
    firebaseAuth = FirebaseAuth.getInstance();
    user = firebaseAuth.getCurrentUser();
    DatabaseReference lobbyRef = FirebaseDatabase.getInstance().getReference(Constants.LOBBIES);
    String owenerMan = ownerName;
    String gameLoc = locIn.getText().toString();
    Double gameCost = Double.parseDouble(costIn.getText().toString());
    String gameDate = displayDate.getText().toString();
    ArrayList<FirebaseUser> lobbyMembers = new ArrayList<>();

    lobbyMembers.add(user);                             // You were adding user into Array after calling constructor

    Lobby newLobby = new Lobby(owenerMan, gameLoc, gameCost, gameDate, lobbyMembers);

    lobbyRef.push().setValue(newLobby);
    Log.v("creator", owenerMan);
    Log.v("newLobby", newLobby.getStartDate());
    Toast.makeText(getApplicationContext(), "Lobby Added!", Toast.LENGTH_SHORT).show();
}
public void submitLobby(){
firebaseAuth=firebaseAuth.getInstance();
user=firebaseAuth.getCurrentUser();
DatabaseReference LobberRef=FirebaseDatabase.getInstance().getReference(常量.LOBBIES);
字符串owenerMan=ownerName;
字符串gameLoc=locIn.getText().toString();
Double gameCost=Double.parseDouble(costIn.getText().toString());
字符串gameDate=displayDate.getText().toString();
ArrayList lobbyMembers=新建ArrayList();
lobbyMembers.add(user);//您是addi
public void submitLobby(){
    firebaseAuth = FirebaseAuth.getInstance();
    user = firebaseAuth.getCurrentUser();
    DatabaseReference lobbyRef = FirebaseDatabase.getInstance().getReference(Constants.LOBBIES);
    String owenerMan = ownerName;
    String gameLoc = locIn.getText().toString();
    Double gameCost = Double.parseDouble(costIn.getText().toString());
    String gameDate = displayDate.getText().toString();
    ArrayList<FirebaseUser> lobbyMembers = new ArrayList<>();

    lobbyMembers.add(user);                             // You were adding user into Array after calling constructor

    Lobby newLobby = new Lobby(owenerMan, gameLoc, gameCost, gameDate, lobbyMembers);

    lobbyRef.push().setValue(newLobby);
    Log.v("creator", owenerMan);
    Log.v("newLobby", newLobby.getStartDate());
    Toast.makeText(getApplicationContext(), "Lobby Added!", Toast.LENGTH_SHORT).show();
}