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

时间:2019-02-18 17:01:55

标签: java android firebase-realtime-database

我有一个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的模块附加。活动可以使用此类上载/更新/删除 Attack,或者在上载Attack 上载/更新/删除时进行监听。 / p>

实施 AttackRepository 使用Firebase

那就是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的值,但其他三个丢失了!

1 个答案:

答案 0 :(得分: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 /攻击:{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}}