база данных FireBase Android, как получить все данные от дочернего узла - PullRequest
0 голосов
/ 27 сентября 2018

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

database = FirebaseDatabase.getInstance();
    myRef = database.getReference().child("Sold").child("Item");

myListView = (ListView)findViewById(R.id.listView);
    final ArrayAdapter<String> myArrayAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, myArrayList);


    myListView.setAdapter(myArrayAdapter);

    myRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
            String value = dataSnapshot.getValue(String.class);
            myArrayList.add(value);
            myArrayAdapter.notifyDataSetChanged();
        }

Это не дает мне никакой ошибки, но просто закрывает мое приложение.Я пытаюсь получить доступ к URL / Sold / Item и передать данные в моем списке

Click this to see my firebase thank you

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Проблема в том, что вы не можете преобразовать получаемый вами dataSnapshot в строку.

Так что было бы лучше сделать так:

 myRef.addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                    for (DataSnapshot dummys : dataSnapshot.getChildren()) {
                        String description = dummys.child("Description").getValue(String.class);
                        int Quantity = dummys.child("Quantity").getValue(Integer.class);
                        //Use your variables here
                    }                        
                }

Или, если вы хотите создатьобъект Dummy:

public class Dummy {

String Description;
Integer Quantity;

public Dummy(String description, Integer quantity) {
    Description = description;
    Quantity = quantity;
}

public String getDescription() {
    return Description;
}

public void setDescription(String description) {
    Description = description;
}

public Integer getQuantity() {
    return Quantity;
}

public void setQuantity(Integer quantity) {
    Quantity = quantity;
}

}

myRef.addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

                    List<Dummy> dummyList = new ArrayList<>();
                    for (DataSnapshot dummys : dataSnapshot.getChildren()) {
                        dummyList.add(dummys.getValue(Dummy.class));
                    }
                }
0 голосов
/ 27 сентября 2018

Вы создаете ссылку с этим:

database = FirebaseDatabase.getInstance();
myRef = database.getReference().child("Sold").child("Item");

И затем вы добавляете ChildEventListener.Это означает, что DataSnapshot в вашем onChildAdded будет вызываться сначала со снимком узла DUMMY 1, а затем со снимком узла DUMMY 2.

Вы звоните dataSnapshot.getValue(String.class) в onChildAdded.Но поскольку DUMMY 1 и DUMMY 2 имеют несколько свойств, у них нет единственного строкового значения.Таким образом, этот вызов возвращает null, что, вероятно, вызывает у вас проблемы.

Если вы хотите добавить сам ключ DUMMY 1, DUMMY 2 к адаптеру, вы можете вызвать dataSnapshot.getKey().В противном случае вы можете получить значение определенных дочерних свойств с помощью dataSnapshot.child("Description").getValue(String.class).

Итак:

myRef.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
        String key = dataSnapshot.getKey();
        String description = dataSnapshot.child("Description").getValue(String.class);
        Long quantity = dataSnapshot.child("Quantity").getValue(Long.class);
        myArrayList.add(key+": "+description+" ("+quantity+")");
        myArrayAdapter.notifyDataSetChanged();
    }

Если вы хотите прочитать все значение в классе, представляющемэлемент (так называемый POJO), самый простой класс:

public class Item {
  public String Description;
  public Long Quantity;
}

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

myRef.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
        String key = dataSnapshot.getKey();
        Item item = dataSnapshot.getValue(Item.class);
        myArrayList.add(key+": "+item.description+" ("+item.quantity+")");
        myArrayAdapter.notifyDataSetChanged();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...