我有一个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。
答案 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
要获得您想要的内容,您需要按照以下步骤操作。
0
。然后在您要在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);
那就是它!