Каков наилучший способ добавить данные в список в базе данных FireBase Realtime - PullRequest
0 голосов
/ 09 октября 2018

Я использую базу данных Firebase в реальном времени и храню список строк в определенной ссылке на хранилище.В настоящее время, чтобы добавить что-то в список

Я делаю следующие шаги.

  1. Прочитать дочернюю ссылку базы данных
  2. получить datasnapshot и проверить, является ли он нулевым (что означает первый раз)
  3. , если он нулевой, напрямую установить локальный список
  4. если dataSnapshot.getValue(); не ноль, то (данные уже присутствуют в БД, поэтому необходимо добавить новые данные в конец его.) Сохранить удаленный список из dataSnapshot.getValue(); в локальныйпеременная.

    , затем добавьте новые данные в конец их

  5. Теперь локальный список содержит все элементы в удаленном, а также новые элементы.сохраните это для дочерней ссылки

Ниже приведен код, который я написал для этого

DatabaseReference reference = root()
        .child(userId)
        .child(list_id);
reference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        reference.removeEventListener(this);
        List<String> value = new ArrayList<>();
        if (dataSnapshot.getValue() == null) {
            value.add(message);
        } else {
            if (dataSnapshot.getValue() instanceof List && ((List) dataSnapshot.getValue()).size() > 0 && ((List) dataSnapshot.getValue()).get(0) instanceof String) {
                value = (List<String>) dataSnapshot.getValue();
                value.add(message);
            }
        }
        reference.setValue(value, (databaseError, databaseReference) -> {
            finish();
        });
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        finish();
    }

     private void finish() {
        Log.e(TAG,"save finished");
    }
});

Это много шагов для выполнения простой операции.Кроме того, я все время извлекаю данные из удаленного узла и добавляю новые данные.

Есть ли простой способ сделать это?Я попытался использовать метод push () следующим образом:

DatabaseReference reference = root()
    .child(userId)
    .child(list_id).push();

Но он всегда добавляет новый ключ к значению, которое я добавляю.Может кто-нибудь объяснить, как правильно сделать это с меньшим количеством кода?

ОБНОВЛЕНИЕ:
Моя структура БД, как показано ниже

enter image description here

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Это просто обновление существующего принятого ответа, которое я попробовал и работаю.Это тот же процесс с меньшим количеством строк кода, без использования ValueEventListener и использования метода updateChildren, как указано в принятом ответе.

     DatabaseReference reference = deviceRootReference().child(userId).child(list_id).push();
     Map<String, Object> map = new HashMap<>();
     map.put(reference.getKey(), comment);
     Tasks.await(reference.updateChildren(map));

ПРИМЕЧАНИЕ :Этот код выполняет запись в БД синхронно (Tasks.await блокирует поток), поэтому приведенный выше фрагмент кода должен выполняться только в фоновом потоке

0 голосов
/ 09 октября 2018

Решение, которое вы дали, очень хорошее, но зачем удалять слушателя внутри обратного вызова?Я напишу вам код, чтобы быть более простым.Пожалуйста, смотрите это ниже:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference listIdRef = rootRef.child("list").child(list_id);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<String> list = new ArrayList<>();
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String comment = ds.getValue(String.class);
            list.add(comment);
        }
        //Do what you need to do with your list
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage());
    }
};
listIdRef.addListenerForSingleValueEvent(valueEventListener);

Не игнорируйте ошибки.

Самый простой способ, которым вы можете добавить нового дочернего элемента в ваш 08-10-18 узел, без необходимости получатьenitire list, будет использовать только следующие строки кода:

Map<String, Object> map = new HashMap<>();
map.put("5", "comment55");
rootRef.child("list").child(list_id).updateChildren(map);

Но даже лучшее решение будет использовать вместо списков, карты и дочерние элементы должны быть добавлены с использованием метода push().Таким образом, ваша структура базы данных должна выглядеть следующим образом:

Fireabase-root
    |
    --- usr100
          |
          --- 08-10-18
                |
                --- randomId: "comment1"
                |
                --- randomId: "comment2"
                |
                --- randomId: "comment3"
                |
                --- randomId: "comment4"

И код должен выглядеть следующим образом:

String key = rootRef.child("list").child(list_id).push().getKey();
Map<String, Object> map = new HashMap<>();
map.put(key, "comment5");
rootRef.child("list").child(list_id).updateChildren(map);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...