Android Firebase - 带模型类的databaseException

时间:2017-04-02 05:07:51

标签: android firebase firebase-realtime-database

firebase给出databaseException错误的原因是什么?我是android firebase适配器的新手,我遇到了一个databaseException问题。我试图在MainCommentFragment中获得适配器,因此我可以使用viewPager和recyclerview。但是当我调用mRecyclerView.setAdapter(mCommentAdapter)时似乎有错误;在MainCommentFragment.java中。谁能帮我这个?

Comment.java

public class Comment
{
    public String uid;
    public String username;
    public String body;
    public String time;
    public String choice;

    public int likeCount;
    public int dislikeCount;

    public Map<String, Boolean> likes = new HashMap<>();
    public Map<String, Boolean> dislikes = new HashMap<>();

    public Comment()
    {
    }

    public Comment(String uid, String username, String body, String time, String choice)
    {
        this.uid = uid;
        this.username = username;
        this.body = body;
        this.time = time;
        this.choice = choice;
    }

    public Map<String, Object> toMap()
    {
        HashMap<String, Object> result = new HashMap<>();
        result.put("uid", uid);
        result.put("username", username);
        result.put("time", time);
        result.put("body", body);
        result.put("likeCount", likeCount);
        result.put("dislikeCount", dislikeCount);
        result.put("likes", likes);
        result.put("dislikes", dislikes);
        result.put("choice", choice);

        return result;
    }
}

MainCommentFragment.java

public abstract class MainCommentFragment extends Fragment
{
    /*UI*/
    private RecyclerView mRecyclerView; //declaring recycler view

    /*Firebase*/
    private DatabaseReference mDatabase; //declaring database

    /*Other*/
    private FirebaseRecyclerAdapter<Comment, CommentViewHolder> mCommentAdapter; //declaring adapter for post

    private LinearLayoutManager mLinearLayoutManager; //declaring linear layout manager

    private String postKey;

    /*Function*/
    public MainCommentFragment() //creating a constructor for MainFragment
    {

    }

    @Override
    public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) //when view is created
    {
        super.onCreateView(inflater, container, savedInstanceState);

        View rootView = inflater.inflate(R.layout.fragment_comment, container, false); //fragment_all_posts will invoked

        mDatabase = FirebaseDatabase.getInstance().getReference(); //initializing database

        mRecyclerView = (RecyclerView)rootView.findViewById(R.id.fragment_comment_recycler_view); //initializing recycler view

        mRecyclerView.setHasFixedSize(true); //giving fixed size property to recycler view

        RoomActivity roomActivity = (RoomActivity)getActivity();

        postKey = roomActivity.getPostKey();

        System.out.println("postKey=============================" + postKey);

        return rootView; //returning view
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) //when activity is created
    {
        super.onActivityCreated(savedInstanceState);

        mLinearLayoutManager = new LinearLayoutManager(getActivity()); //initializing linear layout manager
        mLinearLayoutManager.setReverseLayout(true); //make the layout reverse
        mLinearLayoutManager.setStackFromEnd(true); //make the layout stack from end

        mRecyclerView.setLayoutManager(mLinearLayoutManager);  //initialize recycler view

        Query commentQuery = getQuery(mDatabase, postKey); //get query for database

        mCommentAdapter = new FirebaseRecyclerAdapter<Comment, CommentViewHolder>(Comment.class, R.layout.comment_item, CommentViewHolder.class, commentQuery) //initializing post adapter
        {
            @Override
            protected void populateViewHolder(CommentViewHolder viewHolder, Comment model, int position)
            {
                viewHolder.bindToComment(model, new View.OnClickListener()
                {
                    @Override
                    public void onClick(View v)
                    {
                        DatabaseReference globalCommentRef = mDatabase.child("Comment").child(postKey);

                        onLikeClicked(globalCommentRef);
                        switch(v.getId())
                        {
                            case R.id.comment_item_like_btn:
                                onLikeClicked(globalCommentRef);
                                break;
                            case R.id.comment_item_dislike_btn:
                                onDislikeClicked(globalCommentRef);
                                break;
                        }
                    }
                });
            }
        };

        mRecyclerView.setAdapter(mCommentAdapter); //recycler view will not display post adapter
    }

    private void onLikeClicked(DatabaseReference commentRef)
    {
        commentRef.runTransaction(new Transaction.Handler()
        {
            @Override
            public Transaction.Result doTransaction(MutableData mutableData)
            {
                Comment c = mutableData.getValue(Comment.class);

                if(c == null)
                {
                    return Transaction.success(mutableData);
                }

                if(c.likes.containsKey(FirebaseAuth.getInstance().getCurrentUser().getUid()))
                {

                } else
                {
                    c.likeCount = c.likeCount + 1;
                    c.likes.put(FirebaseAuth.getInstance().getCurrentUser().getUid(), true);

                    if(c.dislikeCount != 0)
                    {
                        c.dislikeCount = c.dislikeCount - 1;
                        c.dislikes.remove(FirebaseAuth.getInstance().getCurrentUser().getUid());
                    }
                }

                mutableData.setValue(c);
                return Transaction.success(mutableData);
            }

            @Override
            public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot)
            {
            }
        });
    }
    private void onDislikeClicked(DatabaseReference commentRef)
    {
        commentRef.runTransaction(new Transaction.Handler()
        {
            @Override
            public Transaction.Result doTransaction(MutableData mutableData)
            {
                Comment c = mutableData.getValue(Comment.class);

                if(c == null)
                {
                    return Transaction.success(mutableData);
                }

                if(c.dislikes.containsKey(FirebaseAuth.getInstance().getCurrentUser().getUid()))
                {
                } else
                {
                    c.dislikeCount = c.dislikeCount + 1;
                    c.dislikes.put(FirebaseAuth.getInstance().getCurrentUser().getUid(), true);

                    if(c.likeCount != 0)
                    {
                        c.likeCount = c.likeCount - 1;
                        c.likes.remove(FirebaseAuth.getInstance().getCurrentUser().getUid());
                    }
                }

                mutableData.setValue(c);

                return Transaction.success(mutableData);
            }

            @Override
            public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot)
            {
            }
        });
    }

    public abstract Query getQuery(DatabaseReference databaseReference, String postKey); //declaring query
}

这是错误消息。

com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.Long to type packagename.Comment

0 个答案:

没有答案