我有一个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
的模块。活动可以使用此类上传/更新/删除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
的值,但缺少其他三个!
我无法重现您的问题。这是我尝试过的最小的独立代码:
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}}