我的应用是使用Firebase。我已经使用ChildEventListener来获取数据。
mTaixeReference.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
String strTen = dataSnapshot.child("ten").getValue(String.class);
String strSdt = dataSnapshot.child("sdt").getValue(String.class);
String strLong = dataSnapshot.child("longtitude").getValue(String.class);
String strLat = dataSnapshot.child("latitude").getValue(String.class);
String strDiemden = dataSnapshot.child("diemden").getValue(String.class);
String strThoigian=dataSnapshot.child("thoigian").getValue(String.class);
//Toast.makeText(MapsActivity.this,"Toa do: "+strLat+","+strLong,Toast.LENGTH_LONG).show();
double dblLong = Double.parseDouble(strLong);
double dblLat = Double.parseDouble(strLat);
//Marker marker=mMap.addMarker(new MarkerOptions().position(new LatLng(dblLat,dblLong)).title(strTen));
marker = mMap.addMarker(new MarkerOptions().position(new LatLng(dblLat, dblLong)).
icon(BitmapDescriptorFactory.fromBitmap(iconFactory.makeIcon(strDiemden)))
.title(strTen+"\n"+strThoigian).snippet("Sđt: "+strSdt+"\n Loại xe: "+strLoaixe+"\n Giá: "+strGia));
Markers.put(dataSnapshot.getKey(), marker);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
/* if (Markers.containsKey(dataSnapshot.getKey())) {
String strLong = dataSnapshot.child("longtitude").getValue(String.class);
String strLat = dataSnapshot.child("latitude").getValue(String.class);
Marker marker = Markers.get(dataSnapshot.getKey());
marker.setPosition(new LatLng(Double.parseDouble(strLat),
Double.parseDouble(strLong)));
}*/
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
/* if (Markers.containsKey(dataSnapshot.getKey())) {
Marker marker = Markers.get(dataSnapshot.getKey());
marker.remove();
}*/
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
}
);
当我像这样设置规则时,它运作良好
{
"rules": {
"Taixe":{
".read": true,
".write": true
}
}
}
因为我只想在大约10分钟内获得数据,所以我改变了:
{
"rules": {
"Taixe":{
"$Taixe":{
".read": "data.child('timestamp').val() > (now - 600000)",
".write": true
}
}
}
}
我无法获取数据。在这种情况下如何通过ChildEvenListener获取数据?
这是我的数据:
答案 0 :(得分:1)
将侦听器附加到某个位置时,会检查Firebase读取规则。如果您在该位置没有读取权限,则会立即拒绝您的听众。
知道了,让我们来看看你的规则:
src=""
您正在将监听器附加到{
"rules": {
"Taixe":{
"$Taixe":{
".read": "data.child('timestamp').val() > (now - 600000)",
".write": true
}
}
}
}
。但由于你没有那里的阅读许可,该听众会立即被拒绝。
您尝试根据安全规则过滤数据。但由于规则是在侦听器而非子节点本身上强制执行的,因此您无法使用Firebase规则来过滤数据。此规则称为"规则不是过滤器"。在Firebase documentation,on Stack Overflow或on Google中搜索该短语会为您提供大量结果,以解释更多详情。