Получение дочерних значений из firebase в android-приложение

I am having issues getting my .дочерние элементы, которые находятся на моей firebase отображения на моем listview на моем android приложения.

При использовании следующего кода:

String value = dataSnapshot.child("messages").getValue(String.class);
            list.add(value);
            adapter.notifyDataSetChanged();

Я могу получить данные, но когда в firebase вносится изменение, все данные удаляются и отображается новая запись.

Я хочу быть в состоянии восстановить .например, дочерние записи из базы данных

fDatabase.child("messages").child("message").addChildEventListener(new ChildEventListener()

Я бы только хотел, чтобы он отображал, обновлял и изменял дочерние сообщения.

Может кто-то помочь мне, подключение к базе данных в порядке, приложение не сбой. просто отключение из-за бездействия.

Может ли это быть разрешение на огневую базу?

Мои правила firebase в настоящее время установлены публично, которые я знаю

{
  "rules": {
    "messages":{
    ".read": true,
    ".write":true,  
}
}
  }

Есть советы ?

Мой код

public class MainActivity extends AppCompatActivity {
DatabaseReference fDatabase;
ListView listview;
ArrayList<String> list = new ArrayList<>();
ArrayAdapter <String> adapter;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    listview = (ListView) findViewById(R.id.listview);
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, list);
    listview.setAdapter(adapter);


    fDatabase = FirebaseDatabase.getInstance().getReference();


    fDatabase.child("messages").child("message").addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            String value = dataSnapshot.child("messages").getValue(String.class);
            adapter.add((String)dataSnapshot.child("messages").getValue());
            list.add(value);
            adapter.notifyDataSetChanged();

        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            adapter.clear();
            adapter.add((String)dataSnapshot.child("messages").getValue());
            String value = dataSnapshot.child("messages").getValue(String.class);
            list.add(value);
            adapter.notifyDataSetChanged();

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {


        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}
}

Я посмотрел на этот вопрос, но не могу заставить его работать

Получить идентификатор ребенка от Firebase android

Когда я изменяю свой код на прослушиватель событий, я возвращаю null : null : null

 protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    listview = (ListView) findViewById(R.id.listview);
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line);
    listview.setAdapter(adapter);


    fDatabase = FirebaseDatabase.getInstance().getReference();


    fDatabase.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot messageSnapshot : dataSnapshot.getChildren()) {
                adapter.clear();
                String temp = (String) messageSnapshot.child("temp").getValue();
                String humi = (String) messageSnapshot.child("humi").getValue();
                String status = (String) messageSnapshot.child("status").getValue();
                adapter.add(humi + " : " + temp + " : " + status);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }

Структура базы данных

jmproject-*****
 humi: "77"
 status: "true"
 temp: "24c"

Правила базы данных

{
  "rules": {
    ".read": true,
    ".write":true,  
}
}

2 ответа

  1. Вы перезаписываете данные в дочернем сообщении. Вы ищете dataSnapshot.getChildren (), который возвращает список всех детей. Проблема с вашей реализацией заключается в том, что вы храните только на потомке под ключом «сообщение». Если вы хотите сохранить несколько значений, вам нужно менять ключ каждый раз, когда вы храните сообщение.

    Если вы хотите создать ключ автоматически, вы можете использовать это

    String key = firebaseRef.child("messages").push().getKey();
    

    Это создаст новую уникальную запись под /messages / path. Затем вы можете сохранить данные с помощью этого ключа.

  2. Я думаю, что проблема заключается в том, что вы устанавливаете адаптер в методе oncrete, а не в методах onChildAdded и onChildChanged. Вы должны разместить listView.setAdapter (adapter)в методах childEventListener. А также ваш код в ChildAdded и ChildChanged является избыточным. Поместите код в метод и вызовите метод из методов прослушивателя событий.