在单个RecyclerView中使用Firestore和Firebase RTDB中的数据

时间:2018-03-29 16:51:01

标签: android firebase android-recyclerview google-cloud-firestore

我有一个RecyclerView,它由存储在Firestore数据库中的帖子填充。 每个帖子都被写为具有唯一postID的文档,存储发布的消息,时间戳和类似计数器。

    //mUploads is defined as private List<Upload> mUploads;
    //Upload object stores post message, timestamp and likes      
    mUploads = new ArrayList<>();

    mFireStoreOrdered = mFireStoreInst.collection("posts").orderBy("time");
    mFireStoreOrdered
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if (task.isSuccessful()) {
                        for (DocumentSnapshot doc : task.getResult()) {

                            //For each document get the ID
                            String postID = doc.getId();

                            // Upload object stores post message, timestamp and likes
                            Upload upload = doc.toObject(Upload.class).withId(postID);

                            mUploads.add(upload);
                        }

                        Collections.reverse(mUploads);

                        //Populate Recyclerview
                        mAdapter = new UploadAdapter(MainActivity.this, mUploads);

                        mContentView.setAdapter(mAdapter);


                    } else {
                        //...
                    }
                }
            });

当尝试为这些帖子实现&#34; like&#34; -functionality时,我达到了Firestore的限制,Firestore每秒只能处理一次文档更新。

阅读this article说服我使用Firebase实时数据库通过使用事务操作而不是使用distributed counters来存储这些内容。我不想实时显示喜欢的内容,我只想使用RTDB来处理每秒多次喜欢/不喜欢。

当另外使用Firebase RTDB时,我会将数据添加到路径/ posts / postID / likes。

如何从Firestore获取帖子消息,并将相应的喜欢从RTDB添加到mUploads,然后再将其传递给适配器。具体来说,是否可以确保我为其相应的帖子设置正确的like值,而不查询每个postID。

1 个答案:

答案 0 :(得分:0)

对于Firestore来说,这是一种非常常见的做法,用于在Firebase实时数据库中存储喜欢的数量,否则您将对每次读/写操作收取费用,如我在{{ 3}}。因此,使用Firebase实时数据库,您可以免费托管喜欢的数量。

那么,怎么办呢?首先,你猜对了。喜欢的数量应添加到postId下方,如下所示:

Firebase-root
   |
   --- likes
         |
         --- postIdOne: numberOfLikes //must be stored as an integer
         |
         --- postIdOTwo: numberOfLikes //must be stored as an integer
         |
         --- //and so on

要获得您想要的内容,您需要按照以下步骤操作。

  1. 每次添加新帖子时,请在Firebase Realtime数据库中添加相应的帖子ID,方法是将该特定帖子ID的值设置为0
  2. 每次你得到一个新的喜欢都会将postId的值增加一个。每次用户缩回类似内容时,将该postId的值减1。为实现此目标并获得一致的数据,我建议您使用post
  3. 然后在您要在Firestore中显示数据的适配器类中,当您想要为视图设置喜欢的数量时,只需在该特定的帖子ID节点上附加一个监听器并获取喜欢的数量。在onDataChange()内,将该号码设置为TextView,如下所示:

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference noOfLikesRef = rootRef.child("likes").child(postId);
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String numberOfLikes = "(" + dataSnapshot.getValue() + ")";
            numberOfLikesTextView.setText(numberOfLikes);
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {}
    };
    noOfLikesRef.addListenerForSingleValueEvent(valueEventListener);
    
  4. 那就是它!