Java 读取数据,然后更新数据,并通过保存完成

Java 读取数据,然后更新数据,并通过保存完成,java,android,firebase-realtime-database,Java,Android,Firebase Realtime Database,我需要你帮我解决这个问题: 问题是我想从Firebase的数据库中读取一个名为coins的字符串,然后将其转换为整数值。然后,当我按下一个按钮时,我想向硬币中添加1,然后,我将其转换回字符串值,以将其保存在数据库中 因此,我尝试使用onDataChange读取数据,然后使用 int score=Integer.parseInt(硬币)将其转换为一个名为score的Integer值 之后,我使用onClickListener将1添加到整数中,但Android Studio告诉我: 无法解析分数

我需要你帮我解决这个问题:


问题是我想从Firebase的数据库中读取一个名为
coins
字符串
,然后将其转换为
整数
值。然后,当我按下一个按钮时,我想向硬币中添加1,然后,我将其转换回
字符串
值,以将其保存在数据库中

因此,我尝试使用
onDataChange
读取数据,然后使用
int score=Integer.parseInt(硬币)
将其转换为一个名为score的
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;

    }

}

非常感谢您的帮助。

这是一个基本的范围界定问题:变量只存在于您声明它们的范围内

因此,在
onDataChange
中声明的
int score
onClick
方法中不再可用

您在
onClick
中声明的
Integer score
是一个新变量,这意味着
Integer score=score+1
不起作用,因为右侧的
分数不存在/没有值

解决方案是将
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);
    }
});

这是一个基本的范围界定问题:变量只存在于声明它们的范围内

因此,在
onDataChange
中声明的
int score
onClick
方法中不再可用

您在
onClick
中声明的
Integer score
是一个新变量,这意味着
Integer score=score+1
不起作用,因为右侧的
分数不存在/没有值

解决方案是将
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);
    }
});

请不要重复标题中的标签。另外:对于有关android studio IDE本身的问题,只能使用
android studio
标记。有关Android编程的一般问题,请使用
Android
标记。请不要重复标题中的标记。另外:对于有关android studio IDE本身的问题,只能使用
android studio
标记。有关Android编程的一般问题,请使用
Android
标记。