Я хочу создать страницу «Редактировать профиль пользователя» в Android Studio. Пользователь (который явно вошел в систему) может войти и отредактировать информацию о пользователе, такую как вес и возраст. Вот как настроена моя база данных firebase:

База данных

В этом случае пользователь, вошедший в систему как «Raxor2k», хочет изменить свою информацию, такую как возраст и вес.

Я сделал функцию, которая запрашивает базу данных, и ей удается достичь таблицы «AdditionalUserInfo», что хорошо. Но следующая задача - достичь тех конкретных значений, которые принадлежат вошедшему в систему пользователю.

вот код:

public class UserSettingsActivity extends AppCompatActivity {

    private Button mEditInfoButton;

    private TextView usernameField;

    private EditText ageField, weightField;

    private DatabaseReference dbUsernames;


    DatabaseReference the_additional_userInfo_table = FirebaseDatabase.getInstance().getReference("AdditionalUserInfo");

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_settings);

        ageField = (EditText) findViewById(R.id.ageID);
        weightField = (EditText) findViewById(R.id.weightID);

        mEditInfoButton = (Button) findViewById(R.id.editButton);

        usernameField = (TextView) findViewById(R.id.usernameTextViewID);

        mEditInfoButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                QueryUserInfo();
            }
        });


    }


    public void QueryUserInfo(){
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference the_additional_userInfo_table = database.getReference("AdditionalUserInfo");
        //Query query =the_additional_userInfo_table.child("username");

        the_additional_userInfo_table.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    Toast.makeText(UserSettingsActivity.this, "User exists!", Toast.LENGTH_SHORT).show();
                    // dataSnapshot is the "issue" node with all children with id 0
                    for (DataSnapshot issue : dataSnapshot.getChildren()) {
                        // do something with the individual "issues"
                    }
                    if(!dataSnapshot.exists()){

                        Toast.makeText(UserSettingsActivity.this, "nooooo user!", Toast.LENGTH_SHORT).show();
                    }
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {


            }


        });
    }
}
-1
raxor2k 20 Дек 2019 в 18:38

1 ответ

Чтобы получить данные в AdditionalUserInfo, которые соответствуют конкретному пользователю, вам нужно использовать запрос, который выглядит следующим образом:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference additionalUserInfoRef = rootRef.child("AdditionalUserInfo");
Query userQuery = additionalUserInfoRef.orderByChild("username").equalTo("Raxor2k");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            Map<String, Object> map = new HashMap<>();
            map.put("user-age", "30");
            map.put("user-weight", "30");
            ds.getRef().updateChildren(map);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
userQuery.addListenerForSingleValueEvent(valueEventListener);

Результатом в вашей базе данных будет изменение обоих свойств с 25 на 30. Поскольку вы не добавили базу данных в виде текста, файл, который я использовал в запросе имени пользователя, но более элегантный способ запроса базы данных будет использовать UID.

Query userQuery = additionalUserInfoRef.orderByChild("user-id").equalTo("IXL ... Eoj");
1
Alex Mamo 20 Дек 2019 в 15:49