这是上一篇文章的后续内容,我仍然遇到一些问题 - 请参阅原帖:Populating Android spinner with Firebase Data。
我修改了Firebase规则,以便为每个用户实现基于用户的身份验证。我已经成功实现了这个,但是仍然存在一个问题 - 我的MaintenanceActivity
中的微调器不再填充来自我数据库中propertyAddress
节点的properties
属性。
我当前的安全设置非常适合添加,删除和更新记录,但是,它似乎不会使用propertyAddress
填充微调器。
以下是我的安全规则:
{
"rules": {
"maintenance" : {
"$uid" : {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
},
"properties" : {
"$uid" : {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
}
}
MaintenanceActivity
的代码摘录,我希望它会填充微调器:
fDatabaseRoot.child("properties").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
final List<String> propertyAddressList = new ArrayList<String>();
for (DataSnapshot addressSnapshot: dataSnapshot.getChildren()) {
String propertyAddress = addressSnapshot.child("propertyAddress").getValue(String.class);
if (propertyAddress!=null){
propertyAddressList.add(propertyAddress);
}
}
Spinner spinnerProperty = (Spinner) findViewById(R.id.spinnerProperty);
ArrayAdapter<String> addressAdapter = new ArrayAdapter<String>(MaintenanceActivity.this, android.R.layout.simple_spinner_item, propertyAddressList);
addressAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerProperty.setAdapter(addressAdapter);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
为进一步说明,这是我的数据结构
答案 0 :(得分:1)
在properties
节点下,您有两个ID,第一个是userid
,第二个是push()
方法生成的随机ID。
为了能够访问您需要获取userid
的属性地址,然后使用for(DataSnapshot addressSnapshot: dataSnapshot.getChildren()) {
,您将在随机ID内迭代并获取其中的属性。
所以改变这个:
fDatabaseRoot.child("properties").addListenerForSingleValueEvent(new ValueEventListener() {
到此:
FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();
String userid=user.getUid();
fDatabaseRoot.child("properties").child(userid).addListenerForSingleValueEvent(new ValueEventListener() {