Я пытаюсь создать таблицу лидеров для моего приложения. На данный момент я могу получить таблицу лидеров, чтобы показать UID и общее количество очков пользователя. Однако вместо UID я бы хотел, чтобы отображалось имя пользователя. Есть ли способ добавить имя пользователя в узел «Точки» при сохранении точек? Могу ли я отправить имя текущего пользователя, вошедшего в систему, в узел Score, чтобы я мог вытащить его отсюда при создании списка лидеров?
Вот код, показывающий, как хранятся точки:
package com.example.securityapp;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.MutableData;
import com.google.firebase.database.Transaction;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
import java.util.Collections;
public class industry_standards_questions extends AppCompatActivity {
DatabaseReference databaseUsers, databaseUsername;
FirebaseDatabase database = FirebaseDatabase.getInstance();
FirebaseAuth mAuth;
TextView stmnt;
ImageView image_true, image_false;
Button points, finished;
Statements tfStatements;
int statementsLength;
ArrayList<Item> statementList;
int currentStatement = 0;
int grade = 0;
String name;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_industry_standards_questions);
databaseUsers = database.getReference("Scores");
databaseUsername = database.getReference("Users");
mAuth = FirebaseAuth.getInstance();
FirebaseUser user = mAuth.getCurrentUser();
stmnt = (TextView) findViewById(R.id.statement_TV);
image_true = (ImageView) findViewById(R.id.trueImage);
image_true.setFocusable(false);
image_false = (ImageView) findViewById(R.id.falseImage);
image_false.setFocusable(false);
tfStatements = new Statements();
statementsLength = tfStatements.tfStatements.length;
statementList = new ArrayList<>();
finished = (Button) findViewById(R.id.finish);
points = (Button) findViewById(R.id.final_score);
for (int i = 0; i < statementsLength; i++)
{
statementList.add(new Item(tfStatements.getStatement(i), tfStatements.getAnswer(i)));
}
Collections.shuffle(statementList);
setStmnt(currentStatement);
}
// show Statement
private void setStmnt(int number) {
stmnt.setText(statementList.get(number).getStatement());
}
//check is answer is right
private boolean checkAnswer(int number) {
String answer = statementList.get(number).getAnswer();
return answer.equals("true");
}
public void trueClicked(View view) {
if (checkAnswer(currentStatement)) {
grade++;
}
currentStatement++;
if (currentStatement >= statementsLength) {
score();
return;
}
if (currentStatement <= statementsLength )
setStmnt(currentStatement);
}
public void falseClicked(View view) {
if (!checkAnswer(currentStatement)) {
grade++;
}
currentStatement++;
if (currentStatement >= statementsLength) {
score();
return;
}
if (currentStatement <= statementsLength )
setStmnt(currentStatement);
}
public void score() {
String id = mAuth.getCurrentUser().getUid();
DatabaseReference score = databaseUsers.child(id).child("Points");
final int pointsEarned = grade;
score.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
System.out.println("You scored: " + pointsEarned);
System.out.println("The current score is: " + mutableData.getValue(Integer.class));
mutableData.setValue((mutableData.getValue() == null ? 0 : mutableData.getValue(Integer.class)) + pointsEarned);
System.out.println("The new score is: " + mutableData.getValue(Integer.class));
return Transaction.success(mutableData);
}
@Override
public void onComplete(@Nullable DatabaseError databaseError, boolean b, @Nullable DataSnapshot dataSnapshot) {
}
}
);
Toast.makeText(this, "You scored " + grade + " points!", Toast.LENGTH_LONG).show();
grade = 0;
}
public void FinishedOnClick (View view)
{
Intent intent_finished = new Intent(industry_standards_questions.this, industry_standards_rating_screen.class);
startActivity(intent_finished);
finish();
}
}
Это код таблицы лидеров:
package com.example.securityapp;
import androidx.appcompat.app.AppCompatActivity;
import android.nfc.Tag;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;
import static java.lang.System.in;
public class leaderboard extends AppCompatActivity {
DatabaseReference databaseUsers;
FirebaseDatabase database = FirebaseDatabase.getInstance();
FirebaseAuth mAuth;
TextView score;
private static final String TAG = "leaderboard";
String s;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_leaderboard);
mAuth = FirebaseAuth.getInstance();
FirebaseUser user = mAuth.getCurrentUser();
score = (TextView) findViewById(R.id.tableText);
leaderBoard();
}
public void leaderBoard(){
database.getReference().child("Scores").addValueEventListener(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
System.out.println("The score is: " + snapshot.child("Points").getValue());
s = s + snapshot.getKey() + " " + snapshot.child("Points").getValue() + "\n";
score.setText(s);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
// Getting Post failed, log a message
Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
}
});
}
}
Это формат базы данных:
Есть ли в любом случае, я могу получить имя пользователя пользователя для хранения под Scores -> UID вместе с точками
Я пробовал этот код, но он не работает:
package com.example.securityapp;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.MutableData;
import com.google.firebase.database.Transaction;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
import java.util.Collections;
public class industry_standards_questions extends AppCompatActivity {
DatabaseReference databaseUsers, databaseUsername;
FirebaseDatabase database = FirebaseDatabase.getInstance();
FirebaseAuth mAuth;
TextView stmnt;
ImageView image_true, image_false;
Button points, finished;
Statements tfStatements;
int statementsLength;
ArrayList<Item> statementList;
int currentStatement = 0;
int grade = 0;
String name;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_industry_standards_questions);
databaseUsers = database.getReference("Scores");
databaseUsername = database.getReference("Users");
mAuth = FirebaseAuth.getInstance();
FirebaseUser user = mAuth.getCurrentUser();
stmnt = (TextView) findViewById(R.id.statement_TV);
image_true = (ImageView) findViewById(R.id.trueImage);
image_true.setFocusable(false);
image_false = (ImageView) findViewById(R.id.falseImage);
image_false.setFocusable(false);
tfStatements = new Statements();
statementsLength = tfStatements.tfStatements.length;
statementList = new ArrayList<>();
finished = (Button) findViewById(R.id.finish);
points = (Button) findViewById(R.id.final_score);
for (int i = 0; i < statementsLength; i++)
{
statementList.add(new Item(tfStatements.getStatement(i), tfStatements.getAnswer(i)));
}
Collections.shuffle(statementList);
setStmnt(currentStatement);
}
// show Statement
private void setStmnt(int number) {
stmnt.setText(statementList.get(number).getStatement());
}
//check is answer is right
private boolean checkAnswer(int number) {
String answer = statementList.get(number).getAnswer();
return answer.equals("true");
}
public void trueClicked(View view) {
if (checkAnswer(currentStatement)) {
grade++;
}
currentStatement++;
if (currentStatement >= statementsLength) {
score();
return;
}
if (currentStatement <= statementsLength )
setStmnt(currentStatement);
}
public void falseClicked(View view) {
if (!checkAnswer(currentStatement)) {
grade++;
}
currentStatement++;
if (currentStatement >= statementsLength) {
score();
return;
}
if (currentStatement <= statementsLength )
setStmnt(currentStatement);
}
public void score() {
String id = mAuth.getCurrentUser().getUid();
DatabaseReference score = databaseUsers.child(id).child("Points");
DatabaseReference username = databaseUsers.child(id).child("Username");
final int pointsEarned = grade;
final String userName = databaseUsername.child(id).child("username").toString();
score.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
System.out.println("You scored: " + pointsEarned);
System.out.println("The current score is: " + mutableData.getValue(Integer.class));
mutableData.setValue((mutableData.getValue() == null ? 0 : mutableData.getValue(Integer.class)) + pointsEarned);
System.out.println("The new score is: " + mutableData.getValue(Integer.class));
return Transaction.success(mutableData);
}
@Override
public void onComplete(@Nullable DatabaseError databaseError, boolean b, @Nullable DataSnapshot dataSnapshot) {
}
}
);
username.runTransaction(new Transaction.Handler() {
@NonNull
@Override
public Transaction.Result doTransaction(@NonNull MutableData mutableData) {
mutableData.setValue(userName);
return Transaction.success(mutableData);
}
@Override
public void onComplete(@Nullable DatabaseError databaseError, boolean b, @Nullable DataSnapshot dataSnapshot) {
}
});
Toast.makeText(this, "You scored " + grade + " points!", Toast.LENGTH_LONG).show();
grade = 0;
}
public void FinishedOnClick (View view)
{
Intent intent_finished = new Intent(industry_standards_questions.this, industry_standards_rating_screen.class);
startActivity(intent_finished);
finish();
}
}