我正在尝试在Firebase实时数据库->规则->模拟器上测试简单的代码,但无法读取。我只是在尝试docs
中的简单代码"JetonAlanlar" : {
".write": "auth != null && !root.child('Banned').hasChild(auth.uid)",
"Sorular":{
"Tarih":{
".read": "query.orderByKey && query.limitToFirst <=30"
},
}
},
这是模拟器运行代码:
/JetonAlanlar/Sorular/Tarih
模拟器表示读取权限被拒绝。是模拟器上的这个问题,还是Firebase Realtime数据库不支持基于查询的规则。
编辑:
这是我在Android应用程序中查询的代码
public class SorularFragmentYeni extends SoruAdaptor {
public SorularFragmentYeni() {}
@Override
public Query getQuery(DatabaseReference databaseReference) {
...
return databaseReference.child("JetonAlanlar/Sorular").child("Tarih");
}
}
也
public abstract class SoruAdaptor extends Fragment implements RewardedVideoAdListener {
...
public abstract Query getQuery(DatabaseReference databaseReference);
}
答案 0 :(得分:1)
正如André所说:Firebase数据库的规则模拟器不允许您模拟查询。它仅模拟对某个位置的读取或对该位置的写入。这就解释了为什么您的读取不起作用的原因:您的规则仅允许查询,而模拟器不使用查询。
您的代码也不会返回查询:
databaseReference.child("JetonAlanlar/Sorular").child("Tarih")
此代码仅是从您的安全规则不允许的位置读取的内容。如果要允许此读取操作,则规则应为:
"JetonAlanlar" : {
"Sorular":{
"Tarih":{
".read": true
}
}
}
如果要保留当前规则,则需要确保代码与查询允许的内容匹配:
public Query getQuery(DatabaseReference databaseReference) {
...
return databaseReference.child("JetonAlanlar/Sorular").child("Tarih")
.orderByKey().limitToFirst(30);
}
认为安全规则将为您添加最后两个子句是一个常见错误。但是,这不是Firebase的安全规则的工作方式:Firebase只是根据规则检查是否允许查询。