gpt4 book ai didi

java - 如何在 Firebase 中添加计数器?

转载 作者:搜寻专家 更新时间:2023-11-01 09:33:18 24 4
gpt4 key购买 nike

伙计们,我有数据库:事件和用户。

当某个用户对某个事件感兴趣时单击按钮,这将在事件数据库中的用户的 eventHasInterest 中添加一个子项,并且在数据库中用户将添加感兴趣的事件。它已经在工作,但我需要放一个计数器来显示有多少人感兴趣,但它不起作用,只添加一次。我需要一次点击,+1,再点击一次 -1。

btn_interest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

databaseEvent.child(getKeyEvent()).addListenerForSingleValueEvent( //get the event by key
new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {

final Event event = dataSnapshot.getValue(Event.class);
user = FirebaseAuth.getInstance().getCurrentUser(); //get the user logged in
if(user != null) {

databaseUser.orderByChild("userEmail").equalTo(user.getEmail()).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {

for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) {

final User user = userSnapshot.getValue(User.class); // user data logged in

databaseUser.orderByChild("userHasInterest").equalTo(event.getEventId()).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (!dataSnapshot.exists()) {
databaseUser.child(user.getUserId()).child("userHasInterest").child(event.getEventId()).setValue(event.getEventId());
databaseEvent.child(event.getEventId()).child("eventAmount").setValue(dataSnapshot.getChildrenCount()+1);
} else {
//event already exists
}
}


@Override
public void onCancelled(DatabaseError databaseError) {
}
});

databaseEvent.orderByChild("eventHasInterest").equalTo(user.getUserId()).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(!dataSnapshot.exists()){
databaseEvent.child(event.getEventId()).child("eventHasInterest").child(user.getUserId()).setValue(user.getUserId());
} else{
//user already exist
}
}

我的火力基地: enter image description here

最佳答案

dataSnapshot.getChildrenCount() 不返回 eventAmount 的 int 值,它返回 eventAmount 拥有的 child 的数量。在您的情况下,eventAmount 将始终返回 0,因为没有 eventAmount 的子项。我建议不要使用 getChildrenCount,而是获取 dataSnapshot 的值,并将该值解析为一个 int。之后,将该值增加 1,然后存储该值。

databaseEvent.child(event.getEventId()).child("eventAmount").setValue(Integer.parseInt(dataSnapshot.getValue().toString()) + 1);

编辑:正如 Frank 所建议的,建议使用事务存储值,以帮助避免并发更新。我用了this post ,以及 Frank 链接以帮助编写代码的帖子。

public void updateCount(DatabaseReference database){
database.runTransaction(new Handler() {
@Override
public Result doTransaction(MutableData mutableData) {

//Currently no value in eventAmount
if(mutableData.getValue() == null){
mutableData.setValue(1);
}
else{
mutableData.setValue(Integer.parseInt(mutableData.getValue().toString()) + 1);
}
return Transaction.success(mutableData);
}

@Override
public void onComplete(DatabaseError databaseError, boolean b,
DataSnapshot dataSnapshot) {
//Probably log the error here.
}
});
}

所以在你的“userHasInterest”onDataChange 方法中,像这样调用我上面的方法。

@Override
public void onDataChange(DataSnapshot dataSnapshot){
if(!dataSnapshot.exists()) {
databaseUser.child(user.getUserId()).child("userHasInterest").child(event.getEventId()).setValue(event.getEventId());
updateCount(databaseEvent.child(event.getEventId()).child("eventAmount")); //New line here
} else {
//event already exists
}
}

关于java - 如何在 Firebase 中添加计数器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45427717/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com