如何在Firebase中添加计数器?

ViníciusCaetano

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

当某个用户对某个事件感兴趣时,单击按钮,这将在EventHasInterest中与该事件在数据库中添加一个子项,并且在数据库中User将添加对该事件感兴趣的事件。它已经在工作,但是我需要显示一个计数器,以显示有多少人对此感兴趣,但它没有工作,只需添加一次即可。我需要一按+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
                                                    }
                                                }

我的火力地堡: 在此处输入图片说明

Ryan Yi

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

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

编辑:如弗兰克(Frank)所建议,建议使用事务存储值以帮助避免并发更新。我使用了这篇文章以及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
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章