Прочитайте данные, затем обновите их и сохраните их sh - PullRequest
0 голосов
/ 01 марта 2020

Мне нужно, чтобы вы помогли мне решить эту проблему:


Проблема в том, что я хочу прочитать String с именем coins из базы данных Firebase и затем превратить его в Integer значение. Затем, когда я нажимаю sh кнопку, я хочу добавить 1 к монетам и после этого я превращаю его обратно в значение String, чтобы сохранить его в базе данных.

Поэтому я попытался сделать это с помощью onDataChange, чтобы прочитать данные, а затем использовать int score = Integer.parseInt(coins) чтобы превратить его в Integer значение, называемое счетом.

После этого я использовал onClickListener, чтобы добавить 1 к целому числу, но Android Studio говорит мне:

Не удается разрешить счет

Я не знаю, как решить эту проблему, поэтому я был бы очень рад, если бы вы могли помочь мне с этим.

Это мой код :

public class HomeFragment extends Fragment {

    public HomeFragment() {
        // Required empty public constructor
    }

    //firebase
    FirebaseAuth firebaseAuth;
    FirebaseUser user;
    FirebaseDatabase firebaseDatabase;
    DatabaseReference databaseReference;
    StorageReference storageReference;

    //init view
    ImageButton addCoinsBtn;
    TextView coinsTv;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view =inflater.inflate(R.layout.fragment_home, container, false);

        //init firebase
        firebaseAuth = FirebaseAuth.getInstance();
        user = firebaseAuth.getCurrentUser();
        firebaseDatabase = FirebaseDatabase.getInstance();
        databaseReference = firebaseDatabase.getReference("Users");
        storageReference = getInstance().getReference();//firebase storage reference


        coinsTv=(TextView)view.findViewById(R.id.coinsTv);
        addCoinsBtn=(ImageButton)view.findViewById(R.id.add_coins);



        Query query = databaseReference.orderByChild("email").equalTo(user.getEmail());
        query.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                //check until required data get
                for (DataSnapshot ds : dataSnapshot.getChildren()){
                    //get data
                    String coins = ""+ds.child("coins").getValue();

                    int score = Integer.parseInt(coins);


                    //set data
                    coinsTv.setText(score);


                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

        addCoinsBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FirebaseDatabase database = FirebaseDatabase.getInstance();
                DatabaseReference coins = database.getReference("Users/"+ user.getUid() +"/coins");

                Integer  score =  score + 1;
                String scorefinal = Integer.toString(score);
                coins.setValue(scorefinal);


            }
        });

        return view;

    }

}

Большое спасибо за помощь.

1 Ответ

2 голосов
/ 01 марта 2020

Это основная проблема c: переменные существуют только в той области, где вы их объявляете.

Таким образом, int score, который вы объявляете в onDataChange, больше не доступен в методе onClick.

И Integer score, который вы объявляете в onClick, является новой переменной, что означает, что Integer score = score + 1; не будет работать, потому что score в правой части не существует / имеют значение.

Решение состоит в том, чтобы объявить score на один уровень выше, как поле члена вашего `` класса:

Integer score = -1;

Query query = databaseReference.orderByChild("email").equalTo(user.getEmail());
query.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot ds : dataSnapshot.getChildren()){
            String coins = ""+ds.child("coins").getValue();

            score = Integer.parseInt(coins);

            coinsTv.setText(score);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException(); // never ignore errors
    }
});

addCoinsBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference coinsRef = database.getReference("Users/"+ user.getUid() +"/coins");

        score = score + 1;
        String scorefinal = Integer.toString(score);
        coinsRef.setValue(scorefinal);
    }
});

Я бы настоятельно рекомендовал хранить значение в виде числа в базе данных, поскольку оно экономит ваше постоянное преобразование из строки в целое число и обратно. Если вы сделаете это, приведенный выше код станет:

Integer score = -1;

Query query = databaseReference.orderByChild("email").equalTo(user.getEmail());
query.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot ds : dataSnapshot.getChildren()){
            score = ds.child("coins").getValue(Integer.class);
            coinsTv.setText(score);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException(); // never ignore errors
    }
});

addCoinsBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference coinsRef = database.getReference("Users/"+ user.getUid() +"/coins");
        coinsRef.setValue(score+1);
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...