com.google.firebase.database.DatabaseException: 无法将 java.lang.String 类型的值转换为 int

com.google.firebase.database.DatabaseException: Failed to convert a value of type java.lang.String to int

package com.pradeephr.firebasedemo;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.google.firebase.database.ChildEventListener;
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.pradeephr.firebasedemo.model.Person;

public class MainActivity extends AppCompatActivity {
    private EditText editText;
    private EditText editText1;
    private TextView textView;
    private Button buttonSend;
    private Button buttonRead;

    private FirebaseDatabase mDatabase;
    private DatabaseReference mRef;

    private ChildEventListener mchildEventListener;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initViews();
        mDatabase=FirebaseDatabase.getInstance();
        mRef=mDatabase.getReference("user");

        this.buttonSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendData();

            }
        });
        this.buttonRead.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                readData();
            }
        });

        mchildEventListener=new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
                Person p=snapshot.getValue(Person.class);
                Log.d("TAG",p.getName()+" "+p.getAge());
            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {

            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot snapshot) {

            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {

            }

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

            }
        };
        mRef.addChildEventListener(mchildEventListener);


    }

    private void sendData(){
        String dataName=editText.getText().toString();
        int dataAge=Integer.parseInt(editText1.getText().toString());
        String key=mRef.push().getKey();

        // when class is present in package
        Person person=new Person(dataAge,dataName);
        assert key != null;
        mRef.child(key).setValue(person);

        Toast.makeText(MainActivity.this,"Data inserted...",Toast.LENGTH_SHORT).show();
    }
    private void readData(){

    }

    private void initViews() {
        editText=findViewById(R.id.editTextName);
        textView=findViewById(R.id.text);
        buttonSend=findViewById(R.id.btn_send);
        buttonRead=findViewById(R.id.btn_read);
        editText1=findViewById(R.id.editTextAge);
    }
}

我正在尝试在我的代码中添加一个 childEventListener,并且我正在从 FirebaseDatabase 中获取对“用户”的 mRef 引用。

一旦创建新用户,就会从 childEventListener 调用 onChildAdded 方法,并将获得的数据用于登录 logcat。

我正在向 Firebase 添加人名 (String) 和年龄 (int)。 但是在从 firebase 检索数据时我遇到了这个错误。

This is how data is added in Firebase.

Cannot resolve this error

Person class

Format in which data is sent to Firebase

如果用 String 保存 val,

你必须使用 Integer.parseInt(val, 16);

您的代码中的问题在于您将 age 作为字符串添加到数据库中,然后您试图将其作为数字读取,因此出现错误。

看到双引号 "" 了吗?这使得 20 成为一个字符串而不是一个数字。

为了解决这个问题,您必须将 age 字段的类型更改为数字(不带双引号),您的问题将得到解决。这样做,您的代码也可能保持不变。