我有一个 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 {
//...
}
}
});
当尝试为这些帖子实现“点赞”功能时,我遇到了 Firestore 的限制,它每秒只能处理一个文档更新。
Reading 本文 https://medium.com/evenbit/on-collision-course-with-cloud-firestore-7af26242bc2d说服我使用 Firebase 实时数据库通过事务操作而不是使用分布式计数器 https://firebase.google.com/docs/firestore/solutions/counters。我不想实时显示喜欢,我只想使用 RTDB 每秒处理多个喜欢/不喜欢。
当另外使用 Firebase RTDB 进行点赞时,我会将数据添加到路径 /posts/postID/likes。
如何从 Firestore 获取帖子消息并将 RTDB 中的相应点赞添加到mUploads
在将其传递给适配器之前。具体来说,是否可以确保我为其相应的帖子设置正确的喜欢值,而无需查询每个帖子ID。
当涉及到 Firestore 时,这是一种非常常见的做法,用于将点赞数存储在 Firebase 实时数据库中,否则您将为每个读/写操作付费,如我的回答中所述post https://stackoverflow.com/questions/48534676/get-collectionreference-count。因此,使用 Firebase 实时数据库,您可以免费托管点赞数量。
那么,怎么办呢?首先,你猜对了。喜欢的数量应该添加在下面postId
像这样:
Firebase-root
|
--- likes
|
--- postIdOne: numberOfLikes //must be stored as an integer
|
--- postIdOTwo: numberOfLikes //must be stored as an integer
|
--- //and so on
为了实现您想要的目标,您需要执行以下步骤。
- 每次添加新帖子时,请像上面一样在 Firebase 实时数据库中添加相应的帖子 ID,方法是将特定帖子 ID 的值设置为
0
.
- 每次获得新的点赞时,该 postId 的值就会增加一。每次用户撤回点赞时,该 postId 的值就会减一。为了实现这一点并获得一致的数据,我建议您使用Firebase 事务 https://firebase.google.com/docs/database/android/read-and-write#save_data_as_transactions.
-
然后,在您显示来自 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);
就是这样!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)