Gabby Cervantes
Gabby Cervantes

Reputation: 95

How do i store an ArrayList of users in a Firebase Database in Android?

Im trying to make an app that has Lobbies of users. What i thought of is having and Model for lobby and one of its attributes would be an ArrayList of Users. But from what ive read so far, it is easier said than done. This is what i have so far...

Lobby.class (Lobby Model)

@Parcel
public class Lobby {
    private String owner;
    private String location;
    private double cost;
    private String startDate;
    private ArrayList<FirebaseUser> members;

    public Lobby(){

    }

    public Lobby(String owner, String location, double cost, String startDate, ArrayList<FirebaseUser> members) {
        this.owner = owner;
        this.location = location;
        this.cost = cost;
        this.startDate = startDate;
        this.members = members;
    }

    public String getOwner() {
        return owner;
    }

    public void setOwner(String owner) {
        this.owner = owner;
    }

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }

    public double getCost() {
        return cost;
    }

    public void setCost(double cost) {
        this.cost = cost;
    }

    public String getStartDate() {
        return startDate;
    }

    public void setStartDate(String startDate) {
        this.startDate = startDate;
    }

    public ArrayList<FirebaseUser> getMembers() {
        return members;
    }

    public void setMembers(ArrayList<FirebaseUser> members) {
        this.members = members;
    }

    public String getDateText(){
        String dateString = DateFormat.getDateInstance().format(new Date());
        return dateString;
    }

    public int getTotalMembers(){
        return members.size();
    }

}

and this is where i save the Lobby to 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();
}

}

When i run my code, an error appears saying that my getTotalMembers() function in my Lobby.class file is returning a null pointer exception. The array does not store

Upvotes: 2

Views: 2640

Answers (1)

Deep Patel
Deep Patel

Reputation: 2644

Try once replacing this function, and let me know, what happens:

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

Upvotes: 1

Related Questions