Как установить более одного объекта для одного ребенка? - PullRequest
1 голос
/ 20 октября 2019

У меня есть приложение, которое позволяет пользователю добавлять заметки. Примечания должны храниться в базе данных Firebase. Моя проблема сейчас заключается в том, что я не могу сохранить более одной заметки, но она просто обновляет заметку, которая уже существует в базе данных. Я думаю, вам может понадобиться добавить уникальный идентификатор для каждой заметки, но я не знаю, как это сделать. Вот что у меня сейчас.

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 ]

1 голос
/ 20 октября 2019

Ваш текущий код для сохранения заметки сводится к:

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 пользователя. Поэтому, если вы сохраняете вторую заметку, вы перезаписываете первую.

Чтобы разрешить сохранение нескольких узлов, вам нужно создать дополнительный уровень в вашем JSON под Notes. Самый простой способ сделать это - вызвать push() перед записью значения. Итак:

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

Каждый раз, когда вы вызываете push(), клиент Firebase генерирует уникальный дочерний узел под этим местоположением. Я настоятельно рекомендую прочитать документацию Firebase по , работающему со списками данных , так как это объясняет гораздо больше по этой теме.

0 голосов
/ 20 октября 2019

Вам нужно добавить случайный идентификатор перед вставкой объекта данных

как

users = db.getReference("Users").child(mAuth.getCurrentUser().getUid()).child("Notes").child(randomId);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...