【问题标题】:How can I associate two different child nodes in different references in a Firebase database?如何在 Firebase 数据库的不同引用中关联两个不同的子节点?
【发布时间】:2018-03-27 11:05:57
【问题描述】:

我对 Firebase 比较陌生,我试图通过将用户数据放入两个不同的路径来避免分层数据,就像它在 documentation 中所说的那样。因此,计划是让每个用户拥有两个不同的唯一标识符;一个节点用于他或她的帐户信息,另一个节点用于任务板。所以每个用户都应该有一个信息节点和一个任务板节点。

问题是我不能多次使用同一个唯一标识符。

这个 sn-p 在数据库中创建用户:

private void addUser(final String email, String password, final String lastName, final String firstName) {
    auth.createUserWithEmailAndPassword(email,password)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {

                    Log.d(TAG, "createUserWithEmail:success");
                    FirebaseUser user = auth.getCurrentUser();

                    //Create a reference for task board ids
                    taskBoardRef = database.getReference().child("taskboard_ids");

                    String boardId = taskBoardRef.push().getKey();
                    Log.i("Check",boardId);

                    //Attach user object to user reference
                    userRef.push().setValue(new Employee(firstName,lastName,email,boardId));

                    //Attach a default task board to the taskboard
                    taskBoardRef.push().setValue(new TaskBoard("Default"));


                    //Create a new SessionManagement instance
                    //Temporarily store user info
                    SessionManagement sessionManagement = new SessionManagement(getApplicationContext(),auth.getCurrentUser().getEmail());
                    sessionManagement.createLoginSession();

                    //Go to task activity
                    intent = new Intent(getApplicationContext(),TasksActivity.class);
                    startActivity(intent);
                    finish();
                }
            });
}

这是任务板类: 任务板.java

public class TaskBoard {
private String taskBoardName;
private FirebaseDatabase database = FirebaseDatabase.getInstance();
private DatabaseReference ref = database.getReference("users_tasks");
private DatabaseReference refForTaskBoard = database.getReference("user_task_boards");

public TaskBoard(){}
TaskBoard(String name){taskBoardName = name;}
public List<Task> tasks;

public List<Task> getTasks() {
    return tasks;
}
public String getTaskBoardName(){return taskBoardName; }
public HashMap<String, Boolean> addTask(Task task)
{
    HashMap<String, Boolean> result = new HashMap<>();
    result.put(task.getName(),task.isComplete());
    return result;
}

public static class Task {
    private String name;
    private boolean complete;

    public Task(){}
    public Task(String name, boolean complete)
    {
        this.name = name;
        this.complete = complete;
    }

    public String getName() {
        return name;
    }


    public boolean isComplete() {
        return complete;
    }
}
}

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    要解决这个问题,请更改以下代码行:

    userRef.push().setValue(new Employee(firstName,lastName,email,boardId));
    taskBoardRef.push().setValue(new TaskBoard("Default"));
    

    userRef.child(boardId).setValue(new Employee(firstName,lastName,email,boardId));
    taskBoardRef.child(boardId).setValue(new TaskBoard("Default"));
    

    使用上述方法,您将能够在两个地方使用从 push() 方法获得的相同 boardId

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多