it-swarm.com.ru

Получение определенных данных из FireBase (Android)

Я делаю приложение для чата, и у меня есть Firebase со следующей структурой. Chat1, Chat2, Chat3 ... используется для сохранения данных различных групп чата. Сообщение1, Сообщение2, Сообщение3 - это сообщения внутри 1-й группы. Может быть от любого автора. 

Чаты

  • Chat1
    • Сообщение1
      • Author1
      • Текст сообщения
    • Message2
      • Author2
      • Текст сообщения
    • Message3
      • Author1
      • Текст сообщения
  • Chat2
    • Сообщение1
      • Author3
      • Текст сообщения
    • Message2
      • Author4
      • Текст сообщения
    • Message3
      • Author1
      • Текст сообщения
  • Chat3

Я хочу получить список всех сообщений от "Автор 1". Значение Message1, Message3 должно быть получено из Chat1, а Message3 также должно быть получено из Chat2. Я хочу отображать все сообщения от 1 автора. 

ref = new Firebase(FIREBASE_URL); //Root URL

ref.addValueEventListener(new ValueEventListener() {

    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
         for (DataSnapshot child : dataSnapshot.getChildren()) {
                 for (DataSnapshot childd : child.getChildren()) {
                     //This might work but it retrieves all the data
                    }
                }
    }

    @Override
    public void onCancelled() {

    }
});

Это дает мне все данные! Как я могу ограничить это "Author1"? 

4
engico

Firebase всегда будет извлекать все узлы, которые вы запрашиваете. Поскольку вы запрашиваете все чаты или весь чат одновременно (неясно, что вы делаете из своего кода), это то, что вы получаете.

Если вы хотите получать меньше данных от Firebase, вам нужно быть более точным в том, что вы от них запрашиваете. Например, если вы хотите отобразить Chat1, начните с прослушивания children узла Chat1.

Этот фрагмент взят из руководства по Firebase для Android :

// Retrieve new posts as they are added to Firebase
ref.addChildEventListener(new ChildEventListener() {
    // Retrieve new posts as they are added to Firebase
    @Override
    public void onChildAdded(DataSnapshot snapshot, String previousChildKey) {
        Map<String, Object> newPost = (Map<String, Object>) snapshot.getValue();
        System.out.println("Author: " + newPost.get("author"));
        System.out.println("Title: " + newPost.get("title"));
    }
    //... ChildEventListener also defines onChildChanged, onChildRemoved,
    //    onChildMoved and onCanceled, covered in later sections.
});

Этот фрагмент выполняет то же, что и ваш текущий пример, но вместо того, чтобы код перебирал данные с помощью for, Firebase подает вам данные по одному сообщению за раз.

Имея это в виду, вы можете фильтровать сообщения. Это двухэтапный процесс: сначала вы заказываете дочерний узел, затем вы ограничиваете, какие узлы будут возвращены.

Query query = ref.orderByChild("Author").equalTo("Author1", "Author");
query.addChildEventListener(new ChildEventListener() {
    // the rest of the code remains the same as above

Этот последний бит лучше всего объясняется в документации Firebase по запросам .

11
Frank van Puffelen

Я не знаю, имелось ли это в виду то, что вы имели в виду, но вот мой код для моей базы данных. Сначала вот моя структура базы данных:

* Корень базы данных

: Пользователи

:

: .... username1

::

:: ...... "Имя": "Значение"

:: ...... "Электронная почта": "значение"

:: ...... "Пароль": "значение"

:

: .... username2

::

:: ...... "Имя": "Значение"

:: ...... "Электронная почта": "значение"

:: ...... "Пароль": "значение"

Вот мой код для извлечения данных из базы данных:

FirebaseDatabase database= FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference().child("Users");

login=myRef.child(name); //here user will sign in using his name so it is based on user, directory will change dynamically
ValueEventListener listener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            User user = dataSnapshot.getValue(User.class);

            String demo=user.Email;
            //email fetched from database
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    };
    login.addValueEventListener(listener);

Здесь класс User.Java содержит 3 строковых значения email, пароля и имени.

public class User {

public String Name;
public String Email;
public String Password;

public User() {
    // Default constructor required for calls to DataSnapshot.getValue(User.class)
}

public User(String name,String pass, String email) {
    this.Name = name;
    this.Email = email;
    this.Password = pass;
}
}
1
user7330119

Вы можете использовать запрос для фильтрации результатов

DatabaseReference mDatabaseReference = FirebaseDatabase.getInstance().getReference("Chat1");
   Query query =  mDatabaseReference.orderByChild("authorName").equalTo("Author1");

Дополнительно можно использовать другие методы фильтрации, приведенные здесь: https://firebase.google.com/docs/reference/Android/com/google/firebase/database/Query

1
Pramod Garg