Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Firebase分级系统中允许每个用户只进行一次分级_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Java 如何在Firebase分级系统中允许每个用户只进行一次分级

Java 如何在Firebase分级系统中允许每个用户只进行一次分级,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,下面是我的android应用程序中每个徒步旅行路线的评分系统。用户可以对每条赛道进行评分,并实时显示平均评分。但现在的问题是,每个用户可以对每条线索进行多次评分。我想让用户只对每条轨迹进行一次评分。我是否需要更改Firebase数据结构,或者我可以按照以下方式重写代码以实现这一点?谢谢:) 单击“分级”按钮时,firebase将自动为每个分级生成随机键,并根据分级类模型设置值,trailId是指向firebase中分级子级和跟踪子级的键 @Override public void onP

下面是我的android应用程序中每个徒步旅行路线的评分系统。用户可以对每条赛道进行评分,并实时显示平均评分。但现在的问题是,每个用户可以对每条线索进行多次评分。我想让用户只对每条轨迹进行一次评分。我是否需要更改Firebase数据结构,或者我可以按照以下方式重写代码以实现这一点?谢谢:)

单击“分级”按钮时,firebase将自动为每个分级生成随机键,并根据分级类模型设置值,trailId是指向firebase中分级子级和跟踪子级的键

    @Override
public void onPositiveButtonClicked(int value, String comment) {
    //
     final Rating rating = new Rating(FirebaseAuth.getInstance().getCurrentUser().getUid(),
             trailId,
            String.valueOf(value),
            comment);

     ratings.push().setValue(rating)
             .addOnCompleteListener(new OnCompleteListener<Void>() {
                 @Override
                 public void onComplete(@NonNull Task<Void> task) {

                 }
             });

@Override
public void onNegativeButtonClicked() {

}
}
评级等级

public class Rating {
  private String UserID;
  private String trailId;
  private String rateValue;
  private String comment;

  public Rating(){

  }

public Rating(String UserID, String trailId, String rateValue, String comment) {
    this.UserID = UserID;
    this.trailId = trailId;
    this.rateValue = rateValue;
    this.comment = comment;
}

public void setUserID(String UserID) {
    UserID = UserID;
}

public void setTrailId(String trailId) {
    trailId = trailId;
}

public void rateValue(String rateVaule) {
    this.rateValue = rateVaule;
}

public void setCommennht(String comment) {
    this.comment = comment;
}

public String getUserID() {
    return UserID;
}

public String getTrailId() {
    return trailId;
}

public String getRateValue() {
    return rateValue;
}

public String getComment() {
    return comment;
}
}

这是我的数据库结构

"Ratings" : {
"-L8qMG4cttR7VIYMrhNS" : {
  "comment" : "",
  "rateValue" : "1",
  "trailId" : "Trail1",
  "userID" : "bNgsbQKk7rcb755ISW6oDo7EUaJ3"
},
"-L8qMLRyC5TV2kULIMm2" : {
  "comment" : "",
  "rateValue" : "1",
  "trailId" : "Trail2",
  "userID" : "bNgsbQKk7rcb755ISW6oDo7EUaJ3"
},
"-L8qMOdE1QylSX8smLb7" : {
  "comment" : "",
  "rateValue" : "5",
  "trailId" : "Trail2",
  "userID" : "bNgsbQKk7rcb755ISW6oDo7EUaJ3"
},
"-L8qMQjjTCqqCBJ5dbFe" : {
  "comment" : "",
  "rateValue" : "5",
  "trailId" : "Trail2",
  "userID" : "bNgsbQKk7rcb755ISW6oDo7EUaJ3"
},

"-L8qN3RZTPWXy3cWSf2h" : {
  "comment" : "",
  "rateValue" : "1",
  "trailId" : "Trail2",
  "userID" : "oWrUNCA7P8QJlzG1sZ6sHwEcBfu1"
},
"-L8qN8LNzIZNMwu0EGwE" : {
  "comment" : "",
  "rateValue" : "5",
  "trailId" : "Trail2",
  "userID" : "oWrUNCA7P8QJlzG1sZ6sHwEcBfu1"
},
"-L8qNEWQ7GSFPpxJMA9A" : {
  "comment" : "",
  "rateValue" : "5",
  "trailId" : "Trail3",
  "userID" : "oWrUNCA7P8QJlzG1sZ6sHwEcBfu1"
},
"-L8qNP_e45GaJj4EnmKV" : {
  "comment" : "",
  "rateValue" : "1",
  "trailId" : "Trail3",
  "userID" : "kK2ERTyxUgRo4cvrG8gOsN8tRge2"
},
"-L8qNUtkWJjqHlVkFOZy" : {
  "comment" : "",
  "rateValue" : "1",
  "trailId" : "Trail3",
  "userID" : "kK2ERTyxUgRo4cvrG8gOsN8tRge2"
}
},


},

要实现这一点,您必须检查用户是否已经对跟踪进行了评分,使用您的数据库结构,您必须检查所有评分表,并查看用户ID和他投票的跟踪名称是否在列表中。然而,这是非常低效的

我的建议是创建一个新的表users trails,在其中存储用户评定的所有轨迹

例如,对于用户:bNgsbQKk7rcb755ISW6oDo7EUaJ3

"users-trails" : {
 "-bNgsbQKk7rcb755ISW6oDo7EUaJ3" : {
   Trail1: 1
   Trail2: 1
},
然后,当您想要查看用户是否已经对Trail1进行了评分时,您只需要在该表中进行快速检查

将数据添加到此表的代码很简单:

FirebaseDatabase mDatabase = FirebaseDatabase.getInstance();
DatabaseReference userTrailsDB = mDatabase.getReference("user-trails");

userTrailsDB.child(userID).child(trailId).setValue(1);
获取信息也不是很复杂:

userTrailsDB.child(userID).child(trialId).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
               //Do Whatever if exits
            } 


            @Override
            public void onCancelled(DatabaseError error) {

            }
        };

我应该把
userTrailsDB.child(userID).child(trailId).setValue(1)放在哪里因为我还需要检查用户在将值设置到这个usertrailsdb之前是否对trail进行了评分。当您向表rating中添加一些内容时,应该调用它。因此,每次向表rating添加值时,也要向该表添加值。
"users-trails" : {
 "-bNgsbQKk7rcb755ISW6oDo7EUaJ3" : {
   Trail1: 1
   Trail2: 1
},
FirebaseDatabase mDatabase = FirebaseDatabase.getInstance();
DatabaseReference userTrailsDB = mDatabase.getReference("user-trails");

userTrailsDB.child(userID).child(trailId).setValue(1);
userTrailsDB.child(userID).child(trialId).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
               //Do Whatever if exits
            } 


            @Override
            public void onCancelled(DatabaseError error) {

            }
        };