- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在从头开始创建我的第一个应用程序,它是 Android 上的一个论坛应用程序,我已经进入了它的赞成票/反对票部分。
我已将其设置为我的用户可以投反对票(类似于 StackOverflow),但我不知道如何将其限制为每个用户一票。
我正在使用 Firebase-Firestore 作为数据库。
我将赞成票和反对票切换按钮设置为在按钮单击监听器中更新 firestore 中的分数,每个按钮都有各自的选择器 item.xml
。
任何人都可以阐明一种类似于堆栈溢出的方法来限制用户对每个用户的每个答案投一票吗?
感谢任何帮助。
edit
尝试提供的答案之前的当前代码。
应答适配器
public class AnswerAdapter extends FirestoreRecyclerAdapter<Answer, AnswerAdapter.AnswerHolder> {
private QuestionAdapter.OnItemClickListener listener;
private Context mContext;
private static final String TAG = "AnswerAdapter";
/**
* Create a new RecyclerView adapter that listens to a Firestore Query. See {@link
* FirestoreRecyclerOptions} for configuration options.
*
* @param options
*/
public AnswerAdapter(@NonNull FirestoreRecyclerOptions<Answer> options) {
super(options);
}
@NonNull
@Override
public AnswerHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.answer_item, viewGroup, false);
return new AnswerHolder(v);
}
@Override
protected void onBindViewHolder(@NonNull final AnswerAdapter.AnswerHolder answerHolder, final int position, @NonNull final Answer model) {
answerHolder.answerItemTextView.setText(model.getAnswer());
answerHolder.answerAuthorTextView.setText(model.getAuthor());
answerHolder.answerTimeStampTextView.setText(model.getTimestamp());
answerHolder.answerScoreTextView.setText(getSnapshots().getSnapshot(position).get("answerScore").toString());
answerHolder.mAnswerUpVoteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO: 2019-07-26 check order of operations. seems to go through upvote and then also through downvote unchecking state
if (answerHolder.mAnswerUpVoteButton.isChecked()){
answerUpVote(answerHolder, position, model);
} else {
// answerDownVote(answerHolder, position, model);
}
}
});
public class AnswerHolder extends RecyclerView.ViewHolder{
TextView answerItemTextView;
TextView answerScoreTextView;
ToggleButton answerCheckMark;
TextView answerAuthorTextView;
TextView answerTimeStampTextView;
ToggleButton mAnswerUpVoteButton;
ToggleButton mAnswerDownVoteButton;
public AnswerHolder(@NonNull final View itemView) {
super(itemView);
answerItemTextView = itemView.findViewById(R.id.answerItemTextViewId);
answerScoreTextView = itemView.findViewById(R.id.questionScoreId);
answerCheckMark = itemView.findViewById(R.id.answerCheckMarkId);
answerAuthorTextView = itemView.findViewById(R.id.answerAuthorTextViewId);
answerTimeStampTextView = itemView.findViewById(R.id.answerTimeStampTextViewId);
mAnswerUpVoteButton = itemView.findViewById(R.id.answerUpVoteId);
mAnswerDownVoteButton = itemView.findViewById(R.id.answerDownVoteId);
mContext = itemView.getContext();
}
}
private void answerUpVote(@NonNull final AnswerAdapter.AnswerHolder answerHolder, final int position, @NonNull final Answer model) {
final String answerScoreFBValue = getSnapshots().getSnapshot(position).get("answerScore").toString();
final String answerFirebaseIdString = getSnapshots().getSnapshot(position).get("answerFirebaseId").toString();
// Toast.makeText(mContext, "upvote button clicked " + answerScoreFBValue, Toast.LENGTH_SHORT).show();
final CollectionReference answerCollectionRef = FirebaseFirestore.getInstance().collection("Answers");
final DocumentReference answerDocRef = answerCollectionRef.document(answerFirebaseIdString);
answerDocRef.update("answerScore", FieldValue.increment(1)).addOnSuccessListener(new OnSuccessListener<Void>() {
// answerRef.document().update("answerscore", answerScoreTestInt).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d(TAG, "onSuccess: answerScore incremented");
// answerHolder.answerScoreTextView.setText("testing");
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.e(TAG, "onFailure: answerScore was not incremented", e);
}
});
}
Answer.java
package com.example.stairmaster.models;
public class Answer {
private String answer;
private String comment;
private String timestamp;
private int answerScore;
private String author;
private String answerFirebaseId;
private String parentQuestionId;
public Answer(String answer, String timeStamp, String author, String parentQuestionId, int answerScore) {
this.answer = answer;
this.timestamp = timeStamp;
this.answerScore = answerScore;
this.author = author;
this.parentQuestionId = parentQuestionId;
}
public Answer () {
// public no-arg constructor needed
}
public String getAnswerFirebaseId() {
return answerFirebaseId;
}
public void setAnswerFirebaseId(String answerFirebaseId) {
this.answerFirebaseId = answerFirebaseId;
}
public String getAnswer() {
return answer;
}
public void setAnswer(String answer) {
this.answer = answer;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public String getTimestamp() {
return timestamp;
}
public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
}
public int getAnswerScore() {
return answerScore;
}
public void setAnswerScore(int answerScore) {
answerScore = answerScore;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getParentQuestionId() {
return parentQuestionId;
}
public void setParentQuestionId(String parentQuestionId) {
this.parentQuestionId = parentQuestionId;
}
}
最佳答案
您可能会考虑将您的 firebase 数据库中的数据库表修改为如下所示。
user_votes:
- userid: 1234232 // A sample user id for your user
- forumid: 8769765 // The id of the forum or blog
- upvote: 1 // Number of upvotes in that specific forum/blog
- downvote: 0 // Number indicates the downvote to that forum/blog
- forumid: 1233432
- upvote: 1
- downvote: 0
- forumid: 8712169767
- upvote: 0
- downvote: 1
另一个记录特定论坛/博客的赞成票/反对票的表格可能如下所示。
all_votes:
- forumid: 8769765 // The id of the forum or blog
- upvote: 9876 // Number of upvotes in that specific forum/blog
- downvote: 123 // Number indicates the downvote to that forum/blog
- forumid: 1233432
- upvote: 87
- downvote: 12
- forumid: 8712169767
- upvote: 112
- downvote: 10
现在,根据这两个表,您可以轻松决定是否要在 all_votes
表中为论坛 ID 发出 setValue
命令。如果发现用户已经发出了赞成票,则使应用程序逻辑不再在 all_votes
表中为该特定用户发出另一个赞成票。
希望对您有所帮助!
关于java - Android Firestore 将限制为每个用户 1 票,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57225467/
我有一个 ServiceBusQueue(SBQ),它获取大量消息负载。我有一个具有 accessRights(manage) 的 ServiceBusTrigger(SBT),它不断轮询来自 SBQ
在下面给出的结果集中,有 2 个唯一用户 (id),并且查询中可能会出现更多此类用户: 这是多连接查询: select id, name, col1Code, col2Code, col2Va
我正在用 Python 2.7.3 编写一个带有 GRequests 的小脚本和 lxml 可以让我从各种网站收集一些收藏卡价格并进行比较。问题是其中一个网站限制了请求的数量,如果我超过它,就会发回
我想知道何时实际使用删除级联或删除限制以及更新级联或更新限制。我对使用它们或在我的数据库中应用感到很困惑。 最佳答案 在外键约束上使用级联运算符是一个热门话题。 理论上,如果您知道删除父对象也将自动删
下面是我的输出,我只想显示那些重复的名字。每个名字都是飞行员,数字是飞行员驾驶的飞机类型。我想显示驾驶不止一架飞机的飞行员的姓名。我正在使用 sql*plus PIL_PILOTNAME
我正在评估不同的移动框架,我认为 nativescript 是一个不错的选择。但我不知道开发过程是否存在限制。例如,我对样式有限制(这并不重要),但我想知道将来我是否可以有限制并且不能使用某些 nat
我正在尝试使用 grails 数据绑定(bind)将一些表单参数映射到我的模型中,但我认为在映射嵌入式集合方面可能存在一些限制。 例如,如果我提交一些这样的参数,那么映射工作正常: //this wo
是否可以将 django 自过滤器起的时间限制为 7 天。如果日期超过 7 天,则不应用过滤器 最佳答案 timesince 的源代码位于 django/django/utils/timesince.
我想在我的网站上嵌入一个 PayPal 捐赠按钮。但问题是我住在伊朗——这个国家受到制裁,人们不使用国际银行账户或主要信用卡。 有什么想法吗?请帮忙! 问候 沮丧 最佳答案 您可以在伊朗境内使用为伊朗
这是我的查询 select PhoneNumber as _data,PhoneType as _type from contact_phonenumbers where ContactID = 3
这个问题在这里已经有了答案: What is the maximum number of parameters passed to $in query in MongoDB? (4 个答案) 关闭
我的一个项目的 AndroidManifest.xml 变得越来越大(> 1000 行),因为我必须对某些文件类型使用react并且涵盖所有情况变得越来越复杂。我想知道 list 大小是否有任何限制。
在使用 Sybase、Infomix、DB2 等其他数据库产品多年后使用 MySQL 5.1 Enterprise 时;我遇到了 MySQL 不会做的事情。例如,它只能为 SELECT 查询生成 EX
这个问题在这里已经有了答案: What is the maximum number of parameters passed to $in query in MongoDB? (4 个回答) 关闭5年
通常我们是在{$apache}/conf/httpd.conf中设置Apache的参数,然而我们并没有发现可以设置日志文件大小的配置指令,通过参考http://httpd.apache.org/do
我正在搜索最大的 Android SharedPreferences 键值对,但找不到任何好的答案。其次,我想问一下,如果我有一个键,它的字符串值限制是多少。多少字符可以放入其中。如果我需要频繁更改值
我目前正在试验 SoundCloud API,并注意到我对/tracks 资源的 GET 请求一次从不返回超过 200 个结果。关于这个的几个问题: 这个限制是故意的吗? 有没有办法增加这个限制? 如
我正在与一家名为 Dwolla 的金融技术公司合作,该公司提供了一个 API,用于将银行信息附加到用户并收取/发送 ACH 付款。 他们需要我将我的 TLS 最低版本升级到 1.2(禁用 TLS 1.
我在 PHP 中有一个多维数组,如下所示: $array = Array ( [0] => Array ( [bill] => 1 ) [1] => Array ( [
我在获取下一个查询的第一行时遇到了问题: Select mar.Title MarketTitle, ololo.NUMBER, ololo.Title from Markets mar JOIN(
我是一名优秀的程序员,十分优秀!