从Firebase数据库检索时对象丢失数据

问题描述 投票:0回答:1

我有一个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
}

问题

我在Firebase数据库中存储了Attack但是当我尝试检索它们时,它的attack.getHostInfo()有一个值而不是4,如下面的屏幕截图所示。

以下是控制台中该实例的屏幕截图:

enter image description here

如何附加听众

我没有直接将ChildEventListener附加到活动,而是通过一个名为AttackRepository的模块。活动可以使用此类上传/更新/删除anAttack或在上传/更新/删除Attack时收听。

使用Firebase实现AttackRepository

这就是FirebaseRepository class。这是监听器附加的位置:

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的值,但缺少其他三个!

java android firebase-realtime-database
1个回答
0
投票

我无法重现您的问题。这是我尝试过的最小的独立代码:

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 = [Phone] Galaxy A3 (2016),extra_local_port = 48790,extra_attack_host_uuid = cUgi890-Yrg}}

© www.soinside.com 2019 - 2024. All rights reserved.