如何为一个孩子设置多个对象?

时间:2019-10-20 14:50:24

标签: java android firebase firebase-realtime-database

我有一个允许用户添加笔记的应用程序。 注释应存储在Firebase数据库中。 我现在的问题是,我不能保存多个便笺,而只是更新数据库中已经存在的便笺。 我认为您可能需要为每个便笺添加一个唯一的ID,但是我不知道该怎么做。 那就是我现在所拥有的。

public class AddNoteFragment extends Fragment implements View.OnClickListener {

    private EditText ETnoteTitle, ETnoteDesc, ETnoteLastDate;
    private Button saveNoteBTN, deleteNoteBTN;
    private Note note;

    private FirebaseAuth mAuth;
    private FirebaseDatabase db;
    private DatabaseReference users;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_add_note, container, false);

        mAuth = FirebaseAuth.getInstance();
        db = FirebaseDatabase.getInstance();

        ETnoteTitle = view.findViewById(R.id.noteTitle);
        ETnoteDesc = view.findViewById(R.id.noteDesc);
        ETnoteLastDate = view.findViewById(R.id.noteLastDate);
        saveNoteBTN = view.findViewById(R.id.saveNoteBTN);
        saveNoteBTN.setOnClickListener(this);
        deleteNoteBTN = view.findViewById(R.id.deleteNoteBTN);
        deleteNoteBTN.setOnClickListener(this);
        users = db.getReference("Users").child(mAuth.getCurrentUser().getUid()).child("Notes");

        return view;
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.saveNoteBTN:
                note = new Note(ETnoteTitle.getText().toString().trim(),
                        ETnoteDesc.getText().toString().trim(),
                        ETnoteLastDate.getText().toString().trim());
                users.setValue(note).addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        Log.d("NoteAdded", "true");
                    }
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.d("NoteAdded", "false");
                    }
                });
                break;
            case R.id.deleteNoteBTN:
                break;
        }
    }
}

当我添加新笔记时,不会添加数据库中的数据,而是在新数据库中更新 我想要添加新的笔记。

2 个答案:

答案 0 :(得分:1)

您当前用于保存便笺的代码可归结为:

users = db.getReference("Users").child(mAuth.getCurrentUser().getUid()).child("Notes");

note = new Note(ETnoteTitle.getText().toString().trim(),
                ETnoteDesc.getText().toString().trim(),
                ETnoteLastDate.getText().toString().trim());

users.setValue(note)...

这将注释直接设置在用户的Notes节点下。因此,如果您保存第二个便笺,则将覆盖第一个便笺。

要允许保存多个节点,您需要在Notes下的JSON中创建一个额外的级别。最简单的方法是在写入值之前调用push()。所以:

users.push().setValue(note)...

每次调用push()时,Firebase客户端都会在该位置下生成一个唯一的子节点。我强烈建议您阅读working with lists of data上的Firebase文档,因为它对这个主题有更多的解释。

答案 1 :(得分:0)

您需要在插入数据对象之前添加随机ID

喜欢

users = db.getReference("Users").child(mAuth.getCurrentUser().getUid()).child("Notes").child(randomId);