2017-02-07 4 views
0

Мое приложение использует Firebase. Я использовал ChildEventListener для получения данных.Установить правило в Firebase, чтобы получить данные примерно за период

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

Firebase чтения правила проверяются при подключении слушателя к месту. Если у вас нет разрешения на чтение в этом месте, ваш слушатель немедленно отклоняется.

Зная это, давайте посмотрим на ваши правила:

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

Вы прикрепление слушателя Taixe. Но поскольку у вас нет разрешения на чтение, этот слушатель немедленно отклоняется.

Вы пытаетесь отфильтровать данные на основе правил безопасности. Но поскольку правила применяются к слушателю, а не к дочерним узлам, вы не можете использовать правила Firebase для фильтрации данных. Это правило известно как «правила не являются фильтрами». Поиск этой фразы в Firebase documentation, здесь on Stack Overflow или on Google даст вам массу результатов, объясняющих более подробную информацию.

+0

Добро пожаловать. Если бы мой ответ был полезен, нажмите кнопку вверху слева от него. Если он ответил на ваш вопрос, нажмите галочку, чтобы принять его. Таким образом, другие знают, что вам (в достаточной мере) помогли. –

+0

Я читал и пытался менять правила много раз, но я до сих пор не могу получить нужные мне данные. Можете ли вы помочь мне исправить мои правила. –

+0

Как я ответил: если вы присоедините слушателя к '/ Taixe', вам нужно будет иметь разрешение на чтение на этом узле. Поэтому ваши правила должны содержать: '{" rules ": {" Taixe ": {" .read ": true}}}'. И это также означает, что вы не можете иметь правило ниже в дереве, которое автоматически скрывает узлы после X-времени, поскольку [правила не являются фильтрами] (http://stackoverflow.com/search?q=%5Bfirebase%5D+rules+ являются + не + фильтры). Кажется, что вы пытаетесь объединить две функции («скрыть после X времени» и «перечислить всех детей»), которые не могут быть объединены в один список. –