所以伙计们,我有数据库:事件和用户。
当某些用户对某个事件有兴趣点击该按钮时,这将在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
}
}
答案 0 :(得分:1)
dataSnapshot.getChildrenCount()不返回eventAmount的int值,它返回eventAmount具有的子节点数。在您的情况下,eventAmount将始终返回0,因为没有eventAmount的子项。我建议不要使用getChildrenCount,而是获取dataSnapshot的值,并将该值解析为int。之后,将该值递增1,然后存储该值。
// Create a reverse order comparator
Comparator r1 = Collections.reverseOrder();
Collections.sort(ll, r1);
Comparator r2 = Collections.reverseOrder();
Collections.sort(ll, r2);
Comparator r3 = Collections.reverseOrder();
Collections.sort(ll, r3);
编辑:根据Frank的建议,建议使用事务存储值以帮助避免并发更新。我使用this post以及Frank链接来帮助编写代码。
databaseEvent.child(event.getEventId()).child("eventAmount").setValue(Integer.parseInt(dataSnapshot.getValue().toString()) + 1);
所以在你的“userHasInterest”onDataChange方法中,像这样调用上面的方法。
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.
}
});
}