如何动态地向firebase中的子项添加对象?

时间:2017-06-15 06:20:00

标签: android firebase firebase-realtime-database

我认为如果我解释一下我真正想要的东西会更好。这是我的数据库的样子: enter image description here

我想为每个创建的锦标赛添加锦标赛状态,但我在数据检索方面遇到了问题。我有一个名为UserInformation的自定义类,我使用dataSnapshot.getValue()方法,但我不确定如何动态地将锦标赛对象(使用2个布尔值)添加到用户。我已经尝试添加所述对象的arraylist,但这并没有反映在数据库中。

这是我创建用户的代码:

mAuth.createUserWithEmailAndPassword(emailId, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        String userId = mAuth.getCurrentUser().getUid();

                        DatabaseReference currentUser = mDatabase.child(userId);
                        currentUser.child("name").setValue(name);
                        currentUser.child("studentNumber").setValue(studentNumber);
                        currentUser.child("faculty").setValue(mFaculty);
                        currentUser.child("email").setValue(emailId);
                        currentUser.child("isGod").setValue(false);
                        currentUser.child("tournamentStatuses").setValue(new ArrayList<TournamentStatus>());

                        Toast.makeText(RegisterActivity.this,"User successfully registered\nLogged in as "+name,Toast.LENGTH_SHORT).show();
                        mProgressDialog.dismiss();
                    }

我的预感是问题在于ArrayList。 此外,即使我能够添加用户,我将如何检索特定的锦标赛状态?

这是我的UserInformation类:

public class UserInformation {

    public String name;
    public String studentNumber;
    public String faculty;
    public boolean isAdmin;
    public String email;
    public boolean isGod;
    public ArrayList<TournamentStatus> tournamentStatuses;

    //Define this constructor
    public UserInformation() {
        // Default constructor required for calls to DataSnapshot.getValue(UserInformation.class)
    }


    public boolean isGod() {
        return isGod;
    }

    public void setGod(boolean god) {
        isGod = god;
    }

    public String getName() {
        return name;
    }

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

    public String getStudentNumber() {
        return studentNumber;
    }

    public void setStudentNumber(String studentNumber) {
        this.studentNumber = studentNumber;
    }

    public String getFaculty() {
        return faculty;
    }

    public void setFaculty(String faculty) {
        this.faculty = faculty;
    }

    public boolean isAdmin() {
        return isAdmin;
    }

    public void setAdmin(boolean admin) {
        isAdmin = admin;
    }

    public String getEmail() {
        return email;
    }

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

    public ArrayList<TournamentStatus> getTournamentStatuses() {
        return tournamentStatuses;
    }

    public void setTournamentStatuses(ArrayList<TournamentStatus> tournamentStatuses) {
        this.tournamentStatuses = tournamentStatuses;
    }
}

有没有解决方法,或者我应该更改数据库设计?

1 个答案:

答案 0 :(得分:1)

为了使您的工作更轻松,您需要更改一点数据库设计。而不是tournamentStatuses直接使用tournamentId作为节点的名称,如下所示:

Firebase-root
    |
    ---- Tournaments
    |       |
    |       ---- //
    ---- Users
            |
            ---- userId
                   |
                   ---- // user details
                   |
                   ---- tournamentId
                             |
                             ---- isOrganizing: false
                             |
                             ---- isPaticipating: false

通过这种方式,您可以更轻松地查询数据库:

DatabaseReference yourRef = FirebaseDatabase.getInstance().getReference().child("Users").child(uid).child(tournamentId);

其次,要将数据对象写入Firebase数据库,而不是使用List,请使用Map。您需要在pojo中进行此更改,并且还需要使用setValue()方法。

希望它有所帮助。