Android Studio Firebase запрос поиска, возвращающий объект - PullRequest
0 голосов
/ 01 июня 2018

Я программировал эту часть целую неделю и не мог найти решение.База данных Firebase выглядит следующим образом: Структура базы данных Firebase

enter image description here

FIREBASE -> Студенты (база данных) ->

{0}
|- ISIC: 1234567
|- name: "Vladimir"
|- password: "vlad"
|- indeks: "111/11"
|- meals
    |-{0} - amount: 15
    |       name: breakfast
    |-{1} - amount: 2
    |       name: lunch
{1}
|- ISIC: 98765
|- name: "John"
|- password: "doe"
|- indeks: 999/99
|- meals
    |-{0} - amount: 18
    |       name: breakfast
    |-{1} - amount: 20
    |       name: lunch
,...,
{n} (nodes)
|- (Data)
|- (Data)

Когда я нажимаюкнопка для входа в систему, где имя пользователя является Indeks и пароль введен, я хотел бы сначала запросить базу данных, чтобы найти студента, который имеет Indeks (по имени пользователя) и проверить , если пароль этогоstudent точно такой же, как в базе данных .

Мой код выглядит следующим образом:

EditText userName;
EditText pass;
Button logIn;

DatabaseReference dbStudents;

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

    userName = (EditText) findViewById(R.id.username);
    pass = (EditText) findViewById(R.id.password);
    logIn = (Button) findViewById(R.id.login);

    dbStudents = 

FirebaseDatabase.getInstance (). getReference ("Students");

    logIn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //some code which I don't know
        }
    });
}

Моя проблема в том, как получить весь объект Student из Firebase и использовать его после успешного входа в систему.Я использовал: Query, addListenerForSingleValueEvent and orderBy().getData(), но не смог найти проблему с помощью ввода значения String и получения объекта Student.

СПАСИБО В СЛУЧАЕ!:)

ОБНОВЛЕНИЕ !!

public void getKey() {
        dbStudents = FirebaseDatabase.getInstance().getReference("students");
        dbStudents.orderByChild("indeks").equalTo(userName.getText().toString())
                .addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        for(DataSnapshot snapshot : dataSnapshot.getChildren()){
                            key = snapshot.getKey();
                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });
    }

С помощью этого я могу получить ключ узла (ученика), который содержит значение «Indeks» (вводится как имя пользователя),но теперь мне нужно получить извлечение как объект Student , используя ключ (String) из базы данных Firebase.Как я могу это сделать?

ОБНОВЛЕНИЕ 2 !!

Класс питания:

public class Meal {
    private int amount;
    private String name;

    public Meal() {

    }

    public Meal(int amount, String name) {
        this.amount = amount;
        this.name = name;
    }

    public int getAmount() {
        return amount;
    }

    public String getName() {
        return name;
    }

    public void setAmount(int amount) {
        this.amount = amount;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Meal{" +
                "amount=" + amount +
                ", name='" + name + '\'' +
                '}';
    }
}

Класс ученика:

public class Student {
private int ISIC;
private String born;
private String contact;
private String description;
private String imagePath;
private String indeks;
private String issued;
private Meal[] meals;
private String name;
private String password;
private String studies;
private String validity;

    public Student() {

    }

    public Student(int ISIC, String born, String contact, String description, String imagePath,
                   String indeks, String issued, Meal[] meals, String name, String password,
                   String studies, String validity) {
        this.ISIC = ISIC;
        this.born = born;
        this.contact = contact;
        this.description = description;
        this.imagePath = imagePath;
        this.indeks = indeks;
        this.issued = issued;
        this.meals = meals;
        this.name = name;
        this.password = password;
        this.studies = studies;
        this.validity = validity;
    }

    public int getISIC() {
        return ISIC;
    }

    public String getBorn() {
        return born;
    }

    public String getContact() {
        return contact;
    }

    public String getDescription() {
        return description;
    }

    public String getImagePath() {
        return imagePath;
    }

    public String getIndeks() {
        return indeks;
    }

    public String getIssued() {
        return issued;
    }

    public Meal[] getMeals() {
        return meals;
    }

    public String getName() {
        return name;
    }

    public String getPassword() {
        return password;
    }

    public String getStudies() {
        return studies;
    }

    public String getValidity() {
        return validity;
    }


    @Override
    public String toString() {
        return "Student{" +
                "ISIC=" + ISIC +
                ", born='" + born + '\'' +
                ", contact='" + contact + '\'' +
                ", description='" + description + '\'' +
                ", imagePath='" + imagePath + '\'' +
                ", indeks='" + indeks + '\'' +
                ", issued='" + issued + '\'' +
                ", meals=" + meals +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                ", studies='" + studies + '\'' +
                ", validity='" + validity + '\'' +
                '}';
    }

    public void setISIC(int ISIC) {
        this.ISIC = ISIC;
    }

    public void setBorn(String born) {
        this.born = born;
    }

    public void setContact(String contact) {
        this.contact = contact;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public void setImagePath(String imagePath) {
        this.imagePath = imagePath;
    }

    public void setIndeks(String indeks) {
        this.indeks = indeks;
    }

    public void setIssued(String issued) {
        this.issued = issued;
    }

    public void setMeals(Meal[] meals) {
        this.meals = meals;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setStudies(String studies) {
        this.studies = studies;
    }

    public void setValidity(String validity) {
        this.validity = validity;
    }
}

1 Ответ

0 голосов
/ 01 июня 2018

Вы должны использовать этот подход для получения пароля каждого пользователя, но вместо сохранения 0, 1, 2, 3 я бы предложил сохранить идентификатор пользователя в качестве основного узла для каждого пользователя, чтобы вы могли получить от пользователя, который вам нуженпароль, этот метод вместо этого получит вам все пароли от всех пользователей, замените автоматически сгенерированные 0, 1, 2, 3 на mAuth.getCurrentUser().getUid();

 logIn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String uid = mAuth.getCurrentUser().getUid();
                mRef.child("students").child(uid).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                try {
                    for(DataSnapshot snap :  dataSnapshot.getChildren())
                   YourPojoClass obj = snap.getValue(YourPojoClass.class);
                    String password =obj.getPassword();
                     //here compare your local password inserted in your editText with the one pulled from firebase


    }
                }catch (Exception ex){
                 //error

                }
            }

            @Override
            public void onCancelled(DatabaseError error) {
             //cancelled
            }
        });
    }

помните, YourPojoClass.class будет классом с установщикамии получатели с точным именем ваших переменных базы данных

Именно это YourPojo.class

public class Student {
    private int ISIC;
    private String indeks;
    private Meal[] meals;
    private String name;
    private String password;
}

просто не забудьте сделать для него установщики и получатели!

ОБНОВЛЕНИЕ!

Итак, теперь, когда вы получили этот ключ, вы можете получить доступ к данным внутри него

public void getKey() {
        dbStudents = FirebaseDatabase.getInstance().getReference("students");
        dbStudents.orderByChild("indeks").equalTo(userName.getText().toString())
                .addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        for(DataSnapshot snapshot : dataSnapshot.getChildren()){
                            key = snapshot.getKey();
                            Student std = snapshot.getValue(Student.class);
                            String password = std.getPassword();
                            String name = std.getName(); 
                            //... And so on with the other data


                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...