我有一个由一些CardView填充的RecyclerView,其中包含一些TextView和一个Button(带有“like”按钮)。我正在使用Transaction更新一些简单的计数器,但在喜欢/不喜欢之前,我必须检查UserId是否存在于我的数据库的节点中,如:
Post_reference :
----userId_1_String: someValue
----userId_2_String: someValue
----userId_3_String: someValue
如果userId存在,我想删除它然后用事务更新计数器(在不同的节点),否则我想添加它然后更新计数器。 主要的问题是,我基本上只需要检查一次,然后我想删除监听器,以避免内存泄漏,但我找不到让它工作的方法。我一直在使用AddValueListenerForSingleValueEvent,但由于你无法分离它甚至更糟糕
答案 0 :(得分:0)
要实现这一点,您应该在与Post_reference
不同时删除postID
中的值。
案例是,如果我喜欢你的帖子,我应该为你的userID
提供dataSnapshop.exists()
的参考资料,如果我不喜欢你的帖子,我应该什么都没有。因此,您始终可以使用@Override
public void onPostLike(final String postKey) {
final String userKey = FirebaseUtil.getCurrentUserId();
final DatabaseReference postLikesRef = FirebaseUtil.getLikesRef();
postLikesRef.child(postKey).child(userKey).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
// User already liked this post, so we toggle like off.
postLikesRef.child(postKey).child(userKey).removeValue();
} else {
postLikesRef.child(postKey).child(userKey).setValue(ServerValue.TIMESTAMP);
}
}
@Override
public void onCancelled(DatabaseError firebaseError) {
}
});
}
检查您的交易。
public static void ParseTXTFile(string FileName, int CompanyID)
{
try
{
FileInfo file = new FileInfo(FileName);
string Date;
string Time;
string Phone;
string JobNo;
string Name;
using (CsvReader reader = new CsvReader(new StreamReader(FileName), false))
{
while (reader.ReadNextRecord())
{
}
}
}
catch (Exception ex)
{
throw (ex);
}
}
您可以在Friendlypix Firebase示例中找到相同案例的完整功能示例,该示例模拟了一种社交媒体,您可以关注他人并查看他们的帖子。
答案 1 :(得分:0)
解决了这个问题,这很容易,但未来可能会有所帮助。 假设您有一个名为ref:
的数据库引用yourButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final ValueEventListener yourValueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//your code on datasnapshot
ref.removeEventListener(this);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
ref.addValueEventListener(yourValueEventListener);
}
});
这基本上是在节点上读/写并立即分离监听器