Как получить все данные из базы данных Firebase Realtime, если у меня есть следующая структура? - PullRequest
0 голосов
/ 02 июля 2019

У меня есть приложение, в котором все прошедшие проверку пользователи могут публиковать статьи (заголовок, контент, имя пользователя, дата).И у меня есть такая структура:

structure db

Где у меня есть узел posts, и там у меня есть сообщения от разных пользователей.Например, у меня есть идентификатор пользователя, и у этого пользователя разные посты, разделенные ключом push().Итак, как извлечь все данные (все сообщения) из этой структуры?У меня есть следующий код, но я получаю null:

mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        if (dataSnapshot.child("posts").exists()) {
            for (DataSnapshot dataSnapshot1 : dataSnapshot.child("posts").getChildren()) {
                Post post = dataSnapshot1.getValue(Post.class);
                mAdapter.addPost(post);
            }
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        showInformationDialog("Something went wrong! [initializing the list]");
    }
});

И мой класс модели:

public class Post {

    private String title;
    private String content;
    private String author;
    private String date;

    public Post() {
        // default constructor
    }

    public Post(String title, String content, String author, String date) {
        this.title = title;
        this.content = content;
        this.author = author;
        this.date = date;
    }

    public String getTitle() {
        return title;
    }

    public String getContent() {
        return content;
    }

    public String getAuthor() {
        return author;
    }

    public String getDate() {
        return date;
    }
}

Ответы [ 2 ]

1 голос
/ 02 июля 2019

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

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("posts").child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            Post post = ds.getValue(Post.class);
            Log.d(TAG, post.getAuthor());

            //Add the post object to a list and pass it to the adapter
        }
    }

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

Вывод в вашем logcat будет:

danchik_kilmez

Редактировать:

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

Кроме того, когда вы дублируете данные, есть одна вещь, которую нужно иметь в виду,Точно так же, как вы добавляете данные, вы должны поддерживать их.Другими словами, если вы хотите обновить / обнаружить элемент, вы должны делать это в каждом месте, где он существует.

При этом вам следует создать еще один узел с именем allPosts, который будет содержать всесообщения всех пользователей, как в следующем примере схемы:

Firebase-root
   |
   --- allPosts
         |
         --- postId
              |
              --- //post details
              |
              --- uid: "eNAS ... tfz2"

Если вы добавите прослушиватель на узел posts, вы сможете получить все сообщения всех пользователей.

0 голосов
/ 02 июля 2019

Вы можете просто использовать FirebaseRecyclerOptions для извлечения всех данных.

FirebaseRecyclerOptions<Post> options = new FirebaseRecyclerOptions.Builder<Post>()
                .setQuery(YourRef,Post.class)
                .build();

        FirebaseRecyclerAdapter<Post,YAdapterHolder>adapter = new
                FirebaseRecyclerAdapter<Post,YAdapterHolder>(options) {
                    @Override
                    protected void onBindViewHolder(@NonNull final YAdapterHolder holder, final int position, @NonNull Post model) {
                        String userIds = getRef(position).getKey();
                        assert userIds != null;
                        YourRef.child(userIds).addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                if (dataSnapshot.getChildrenCount()!=0){
                         //example value retrive
                                  Long data = dataSnapshot.child("data").getValue(Long.class);
                                String data1 = dataSnapshot.child("data1").getValue(String.class);

                                }


                            }

                            @Override
                            public void onCancelled(@NonNull DatabaseError databaseError) {

                            }
                        });




                    }

                    @NonNull
                    @Override
                    public YAdapterHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
                        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.pendinglistmodel,viewGroup,false);
                        return new YAdapterHolder(view);
                    }
                };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...