【发布时间】:2020-11-30 09:46:13
【问题描述】:
我正在使用 firebase 实时数据库制作一个 android 应用程序。我的规则结构如下:
{
// Allow anyone to read data, but only authenticated content owners can
// make changes to their data
"rules": {
"Users": {
"$uid": {
".read": true,
// or ".read": "auth.uid != null" for only authenticated users
".write": "auth.uid == $uid"
}
}
}
}
这意味着用户应该以经过身份验证的用户身份登录才能写入一些数据。但是,阅读不需要登录。
现在我需要忽略用户的 uid 以免费访问其他用户(即无需登录)。
这是我目前用来读取数据的java代码。
final Intent k = getIntent();
final String school = Objects.requireNonNull(k.getExtras()).getString("School");
final Intent i = getIntent();
final String roll = Objects.requireNonNull(i.getExtras()).getString("Roll");
myRef = myfire.getReference("Users")
.child("GcZoeK7JIbNWVOog6ZjUPiBfxwn2")// **I have problem here.**
.child(school).child(roll);
myRef.child("basic").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String name = (String) dataSnapshot.child("fb01name").getValue().toString();
String number = (String) dataSnapshot.child("fb04roll").getValue().toString();
if(name == null){
Toast.makeText(getApplicationContext(),"Invalid",Toast.LENGTH_SHORT).show();
}
basic model = new basic(name,number);
tvName.setText(name);
tvRoll.setText(number);
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
我无法决定要写什么而不是第一个孩子在没有登录的情况下读取任何数据。
.child("GcZoeK7JIbNWVOog6ZjUPiBfxwn2")
请指导我如何忽略这个孩子?任何帮助将不胜感激。
编辑 @Abdullah Z Khan 的建议“尽量避免使用深度嵌套的孩子”进一步让我深入了解了这个问题。我更改了我的代码,如下所示:
myfire = FirebaseDatabase.getInstance();
final Intent k = getIntent();
final String school = Objects.requireNonNull(k.getExtras()).getString("School");
final Intent i = getIntent();
final String roll = Objects.requireNonNull(i.getExtras()).getString("Roll");
//--------------------the trick----------------
if (school.equals("224613")){
tvSchool.setText("GcZoeK7JIbNWVOog6ZjUPiBfxwn2");
}else if (school.equals("224614")){
tvSchool.setText("uQx5jDVRp9PV3QpM2FBU6HPq5SJ3");
}
final String uid = tvSchool.getText().toString();
//---------------------------------------------------
myRef = myfire.getReference("Users").child(uid).child(roll);
myRef.child("basic").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String name = (String) dataSnapshot.child("fb01name").getValue().toString();
String number = (String) dataSnapshot.child("fb04roll").getValue().toString();
if(name == null){
Toast.makeText(getApplicationContext(),"Invalid",Toast.LENGTH_SHORT).show();
}
basic model = new basic(name,number);
tvName.setText(name);
tvRoll.setText(number);
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
虽然这个PLAN B让我暂时松了口气,但问题还是没有回答。因为每次加入应用我都要写用户的uid代码 (并且必须一次又一次地更新和发布应用程序。等待更好的解决方案。
【问题讨论】:
-
您想从哪个用户读取数据...如果您想忽略该用户.. 那么您想读取哪个
basic节点的底层子节点?
标签: java android firebase-realtime-database firebase-security