【问题标题】:Set rule in Firebase to get data in about a period在 Firebase 中设置规则以在大约一段时间内获取数据
【发布时间】:2017-02-08 11:04:45
【问题描述】:

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

这是我的数据:

【问题讨论】:

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


    【解决方案1】:

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

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

    {
      "rules": {
        "Taixe":{
          "$Taixe":{
            ".read": "data.child('timestamp').val() > (now - 600000)",
            ".write": true
          }
        }
      }
    }
    

    您正在将侦听器附加到 Taixe。但是由于您在那里没有读取权限,因此该侦听器会立即被拒绝。

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

    【讨论】:

    • 我已经阅读并尝试多次更改规则,但仍然无法获得我想要的数据。你能帮我修正我的规则吗?请
    • 正如我所回答的:如果您将侦听器附加到/Taixe,您将需要在该节点具有读取权限。所以你的规则需要包含:{ "rules": { "Taixe":{ ".read": true } } }。这也意味着你不能在树中拥有一个在 X 时间后自动隐藏节点的规则,因为rules are not filters。您似乎正在尝试组合无法在一个列表中组合的两个功能(“X 时间后隐藏”和“列出所有子项”)。
    • 我认为这个例子与我的情况相似。但也许不是firebase.google.com/docs/database/security/…
    • 你的规则很棒,如果你想“让孩子读 X 时间”。但这意味着您不能“列出所有孩子”。这两个要求不能组合在一个列表中,因为rules are not filters
    猜你喜欢
    • 2017-09-24
    • 2019-01-18
    • 1970-01-01
    • 2014-09-03
    • 2022-01-05
    • 2021-10-17
    • 2018-09-13
    • 1970-01-01
    • 2021-07-01
    相关资源
    最近更新 更多