Это продолжение предыдущего сообщения, с которым у меня все еще есть несколько проблем - см. Исходный пост здесь: Заполнение счетчика Android данными Firebase.
Я внес поправки в свои правила 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) {
}
});
Для дальнейшего пояснения вот моя структура данных




Под узлом properties у вас есть два идентификатора, первый - это userid, а второй - случайный идентификатор, сгенерированный методом push().
Чтобы получить доступ к адресу свойства, вам нужно получить userid, а затем, используя for(DataSnapshot addressSnapshot: dataSnapshot.getChildren()) {, вы выполните итерацию внутри случайного идентификатора и получите там атрибуты.
Так что измените это:
fDatabaseRoot.child("properties").addListenerForSingleValueEvent(new ValueEventListener() {
к этому:
FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();
String userid=user.getUid();
fDatabaseRoot.child("properties").child(userid).addListenerForSingleValueEvent(new ValueEventListener() {