我想在firebase中管理多个用户的计数

时间:2017-08-06 07:39:16

标签: java android firebase firebase-realtime-database

我想检索类似的计数器,并希望在firebase数据库上传结果。如果另一个用户喜欢这个帖子,那么like计数器应该增加值,而不是从0开始。

DatabaseLOLCounter.child(post_key).child(mAuth.getCurrentUser().getUid()).child("counter").setValue('like counter value here');
下面的

是我的观看者

viewHolder.mLOL.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    processLOL=true;
                    DatabaseFacepalm.child(post_key).child(mAuth.getCurrentUser().getUid()).removeValue();
                    DatabaseAngry.child(post_key).child(mAuth.getCurrentUser().getUid()).removeValue();
                    DatabaseNeutral.child(post_key).child(mAuth.getCurrentUser().getUid()).removeValue();

                        DatabaseLOL.addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                if (processLOL)
                                    {
                                        if(dataSnapshot.child(post_key).hasChild(mAuth.getCurrentUser().getUid()))
                                        {
                                            //Toast.makeText(MainActivity.this,mAuth.getCurrentUser().getUid(),Toast.LENGTH_LONG).show();
                                            //if already reacted
                                            //DatabaseLOLCounter.setValue(Count = Count - 1 );
                                            updateLOLCounter(false,post_key);
                                            DatabaseLOL.child(post_key).child(mAuth.getCurrentUser().getUid()).removeValue();
                                            processLOL=false;

                                        }
                                        else
                                        {
                                            //if no react
                                            updateLOLCounter(true,post_key);
                                            //DatabaseLOLCounter.setValue(Count = Count + 1 );
                                            DatabaseLOL.child(post_key).child(mAuth.getCurrentUser().getUid()).setValue("lol");
                                            processLOL=false;
                                        }
                                    }

                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {

                            }
                        });

                }
            });

在更新lolCounter中我使用inTransaction管理器,但我不知道如何检索sesults以及如何将其存储在数据库中,我已经尝试过但它没有工作,请纠正我。

    private void updateLOLCounter(final boolean increment, final String post_key) {


    DatabaseLOLCounter.runTransaction(new Transaction.Handler() {
        @Override
        public Transaction.Result doTransaction(MutableData mutableData) {
            if (mutableData.getValue() != null) {
                int value = mutableData.getValue(Integer.class);
                if(increment)
                {
                    value++;

                } else {
                    value--;
                }
                mutableData.setValue(value);

            }
            return Transaction.success(mutableData);
        }

        @Override
        public void onComplete(DatabaseError databaseError, boolean b,
                               DataSnapshot dataSnapshot) {
            // Is the below method is right?
            DatabaseLOLCounter.child(post_key).child(mAuth.getCurrentUser().getUid()).child("counter").setValue(dataSnapshot);
           // Toast.makeText(MainActivity.this,dataSnapshot,Toast.LENGTH_LONG).show();

            // Transaction completed
            //Log.d(TAG, "likeTransaction:onComplete:" + databaseError);
        }
    });
}

控制台正在给我错误" TransactionTooLargeException"

2 个答案:

答案 0 :(得分:1)

在活动之间传递关于意图的过多数据时发生TransactionTooLargeException。它与Firebase无关。 Here you can read more.

答案 1 :(得分:0)

当在服务和应用程序之间交换大量数据时,会抛出

TransactionTooLargeException。当您通过intent extras传递大量数据时,也会发生这种情况。

要处理此异常,您需要分析代码。如果可能,尝试将大操作拆分为小块。另外,尽量不要在服务和应用程序之间交换大量数据(> 1MB)。

查看TransactionTooLargeException的详细信息。