“likeCount”增量器的布尔逻辑

时间:2016-08-28 12:06:09

标签: java android parse-platform boolean increment

我创建了这个incrementLike方法,它增加了我数据库中的整数。不幸的是,我无法弄清楚如何阻止用户每次点击“喜欢”图像时不断递增该值。

我认为likeAlready = true语句无法访问,因为它似乎总是false。我的逻辑/实现有什么问题?

private void incrementLike(int position) {
        ParseQuery<ParseObject> query = new ParseQuery<>("Comment");
        query.whereEqualTo(ParseConstants.KEY_OBJECT_ID, getItem(position).getObjectId());
        query.findInBackground((comment, e) -> {
            if (e == null) {
                // Iterate over all messages and delete them
                for (ParseObject commentObject : comment)
                {
                    boolean likedAlready = false;
                    if (likedAlready == false) {
                        commentObject.increment("likeCount");
                        commentObject.saveInBackground();
                        Toast.makeText(getContext(), "Post liked", Toast.LENGTH_SHORT).show();
                        likedAlready = true;
                    } else {
                        Toast.makeText(getContext(), "You already liked this post", Toast.LENGTH_SHORT).show();
                    }

                }
            } else {
                Log.e("Error", e.getMessage());
            }
        });
    }

更新

我创建了一个名为“Like”的新类表,其中包含两个指针列,即senderId,其中User的objectId和commentObjectId是相关的Comment的objectId。

当按下“喜欢”图像时,我使用senderId和commentObjectId在“Like”表中创建一个新对象。最后一步是确定是否已为该特定Comment对象发送senderId。这就是我到目前为止所做的:

private void incrementLike(int position) {

        ParseQuery<ParseObject> query = new ParseQuery<>(ParseConstants.CLASS_COMMENT);
        query.whereEqualTo(ParseConstants.KEY_OBJECT_ID, getItem(position).getObjectId());
        query.findInBackground((comment, e) -> {
            if (e == null) {
                // Iterate over all messages
                for (ParseObject commentObject : comment)
                {

                    ParseObject newLike = new ParseObject(ParseConstants.CLASS_LIKE);
                    newLike.put(ParseConstants.KEY_SENDER_ID, ParseUser.getCurrentUser());
                    newLike.put(ParseConstants.KEY_COMMENT_OBJECT_ID, commentObject);
                    newLike.saveInBackground();
                    Toast.makeText(getContext(), "Yeet liked", Toast.LENGTH_SHORT).show();

                    ParseQuery<ParseObject> query2 = new ParseQuery<>(ParseConstants.CLASS_LIKE);
                    query2.whereEqualTo(ParseConstants.KEY_COMMENT_OBJECT_ID, commentObject.getObjectId());
                    query2.findInBackground((comment2, e2) -> {
                        if (e2 == null) {

                            // I now have a list of Like objects with the commentObjectId associated with this Comment
                            // Only increment if the User objectId of the current ParseUser does not exist in this list
                            commentObject.increment("likeCount");
                            commentObject.saveInBackground();
                            /*this.adapter.addAll(mYeets);*/
                            notifyDataSetChanged();


                        } else {
                            Log.e("Error", e2.getMessage());
                        }
                    });

                }
            } else {
                Log.e("Error", e.getMessage());
            }
        });
    }

我在最后一步思考时遇到了麻烦。有什么建议吗?

3 个答案:

答案 0 :(得分:2)

  

不幸的是,我无法弄清楚如何阻止用户每次点击&#34;喜欢&#34;时不断增加该值。图像。

当前代码中的简单布尔逻辑实际上是不可行的,因为除了递增db存储计数器之外,还必须存储谁(即用户id)递增它的信息(也在DB中)。您可以提前检查并显示&#34;喜欢&#34;仅当此类用户尚未执行此操作时按钮。

答案 1 :(得分:1)

问题是每次运行incrementLike()方法时,它首先将布尔值初始化为false。所以它的解决方案之一就是将你的布尔值初始化为全局变量。但是这个解决方案的问题是,每次用户运行app时,boolean的值都将丢失。因此,如果您想永久存储它,您必须将它存储在您的数据库中,关于谁喜欢,然后您可以从数据库中检索已经或不存在的人。

答案 2 :(得分:1)

你应该存储“喜欢”它的人(就像谁点击了图标一样)。您可以使用循环来检查诸如Dictionary之类的内容,其中您已将用户的名称保存为键值对。另一个可能有用的参考是Shared Preferences