我有一个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,如下面的屏幕快照所示。
以下是控制台中该实例的屏幕截图:
侦听器的连接方式
我不会将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
的值,但其他三个丢失了!
答案 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}}