Объект пропущенных данных при получении из базы данных Firebase - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть Attack объект.

Attack.java

public class Attack implements Parcelable {
    private String pushId, website;
    private int networkType;
    private long timeMillis;
    private Map<String, String> hostInfo = new HashMap<>();
    private List<String> botIds = new ArrayList<>(); 

    public Attack() {
    }

    public Map<String, String> getHostInfo() {
        return hostInfo;
    }

    // getters/setters
}

Проблема

Я храню Attack в базе данных Firebase, но когда япытаюсь получить их, attack.getHostInfo() имеет одно значение вместо 4, как показано на скриншоте ниже.

Вот снимок экрана этого экземпляра с консоли:

enter image description here

Как подключен слушатель

Я не присоединяю ChildEventListener к действию напрямую, а через модуль под названием AttackRepository.Деятельность может использовать этот класс для загрузки / обновления / удаления Attack или для прослушивания, когда Attack было загружено / обновлено / удалено .

Реализация AttackRepository с использованием Firebase

Это FirebaseRepository класс .Вот где подключен слушатель:

public void startListenForChanges() {
    allAttacksRef.addChildEventListener(this);
}

Таким образом, заинтересованная сторона, Fragment в моем случае, вызывает вышеуказанный метод и получает информацию через AttackRepository при загрузке Attack и т. Д.

И, наконец, вот как заинтересованные стороны получают данные.

public void onChildAdded(@NonNull DataSnapshot dataSnapshot, String s) {
    Attack attack = dataSnapshot.getValue(Attack.class);
    repositoryListener.onAttackUpload(attack);
}

Мой фрагмент должен использовать значения Attack.hostInfo, но остальные три отсутствуют!

1 Ответ

0 голосов
/ 18 февраля 2019

Я не могу воспроизвести вашу проблему.Вот минимальный автономный код, который я пробовал:

final DatabaseReference ref = FirebaseDatabase.getInstance().getReference("54752112");
ref.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        Attack attack = dataSnapshot.getValue(Attack.class);
        Log.i("Attack", attack.toString());
    }

    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String previousChildKey) { }
    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) { }
    @Override
    public void onChildMoved(DataSnapshot dataSnapshot, String previousChildKey) { }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException();
    }
});

Единственное, что я изменил в вашем исходном классе Attack, - это то, что я добавил toString() для печати свойств:

 @Override
 public String toString() {
     return "{ pushId: '"+pushId+"', website: '"+website+"', networkType: "+networkType+
            ", timeMillis: "+timeMillis+", hostInfo: "+hostInfo.toString()+" }";
 }

А вот JSON, который я использовал ( live link ):

{
  "-LZ0zS9LBuBxuW695B_i" : {
    "hostInfo" : {
      "extra_attack_host_uuid" : "cUgi890-Yrg",
      "extra_device_name" : "[Phone] Galaxy A3 (2016)",
      "extra_local_port" : "48790",
      "extra_mac_address" : "aa:81:95:c5:69:94"
    },
    "networkType" : 1,
    "pushId" : "-LZ0zS9LBuBxuW695B_i",
    "timeMillis" : 1550516609582,
    "website" : "http://www.sport24.gr"
  }
}

Когда я запускаю вышеизложенное, он печатает:

I / Attack: {pushId: '-LZ0zS9LBuBxuW695B_i', веб-сайт: 'http://www.sport24.gr', networkType: 1, timeMillis: 1550516609582, hostInfo: {extra_mac_address = aa: 81: 95: c5: 69: 94, extra_device_nameТелефон] Galaxy A3 (2016), extra_local_port = 48790, extra_attack_host_uuid = cUgi890-Yrg}}

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