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
标记。