在Firebase中设置规则以获取大约一段时间内的数据

时间:2017-02-07 15:55:49

标签: android firebase firebase-realtime-database firebase-security

我的应用是使用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获取数据?

这是我的数据:

enter image description here

1 个答案:

答案 0 :(得分:1)

将侦听器附加到某个位置时,会检查Firebase读取规则。如果您在该位置没有读取权限,则会立即拒绝您的听众。

知道了,让我们来看看你的规则:

src=""

您正在将监听器附加到{ "rules": { "Taixe":{ "$Taixe":{ ".read": "data.child('timestamp').val() > (now - 600000)", ".write": true } } } } 。但由于你没有那里的阅读许可,该听众会立即被拒绝。

您尝试根据安全规则过滤数据。但由于规则是在侦听器而非子节点本身上强制执行的,因此您无法使用Firebase规则来过滤数据。此规则称为"规则不是过滤器"。在Firebase documentationon Stack Overflowon Google中搜索该短语会为您提供大量结果,以解释更多详情。