Вытащите имя пользователя из одного узла в другой - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь создать таблицу лидеров для моего приложения. На данный момент я могу получить таблицу лидеров, чтобы показать 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());

            }


        });

    }


}

Это формат базы данных: enter image description here

Есть ли в любом случае, я могу получить имя пользователя пользователя для хранения под 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();
            }


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...