【问题标题】:DatabaseException: can't convert object of java.Lang.String to typeDatabaseException:无法将 java.Lang.String 的对象转换为类型
【发布时间】:2018-11-22 18:04:43
【问题描述】:

我正在尝试从我的 Firebase 实时数据库中检索数据,但遇到了这个问题。

我怀疑我收到此错误是因为我在 DatabaseReference 中的路径。我尝试了不同的路径,但似乎都没有奏效。

这是我的数据库(生成的文本是用户 ID)

我的存储数据结构的类

public class ERDataStructure {
private String temperature;
private String humidity;

public ERDataStructure() {

}
    public ERDataStructure(String temperature, String humidity) {
        this.temperature = temperature;
        this.humidity = humidity;
    }

public String getTemperature(){

    return temperature;
}
public void setTemperature(String temperature){

    this.temperature = temperature;
}

public String getHumidity() {

    return humidity;
}
public void setHumidity(String humidity) {

    this.humidity = humidity;
}
}

我的 ReadingScreen.java (MainActivity)

import ...


public class ReadingScreen extends AppCompatActivity {

//Firebase Initialization
FirebaseAuth mAuth;
FirebaseAuth.AuthStateListener mAuthListener;
private DatabaseReference myRef;
private FirebaseDatabase mFirebaseDatabase;

private static final String TAG = "ReadingScreen";
ERDataStructure mData;
private TextView textViewTemperatureNumber, textViewHumidityNumber;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_reading_screen);
    //Find Views
    textViewHumidityNumber = (TextView) findViewById(R.id.humidity_number);
    textViewTemperatureNumber = (TextView) findViewById(R.id.temperature_number);
    // Initiate Firebase
    mAuth = FirebaseAuth.getInstance();
    mFirebaseDatabase = FirebaseDatabase.getInstance();
    FirebaseUser user = mAuth.getCurrentUser();
    String userID = user.getUid();

     // Non-working Reference, but code works
    //myRef = mFirebaseDatabase.getReference();
    //myRef = mFirebaseDatabase.getReference().child(userID);

     //Crashing Reference
      myRef = mFirebaseDatabase.getReference().child(userID).child("ERDataStructure");
    //myRef = mFirebaseDatabase.getReference("ERDataStructure");
    //
    retrieveData();
}
public void gotoMainMenu (View view)
{
    Intent intent = new Intent(ReadingScreen.this, MainMenu.class);
    startActivity(intent);
}
private void retrieveData(){
    myRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
            ERDataStructure ds = dataSnapshot.getValue(ERDataStructure.class);
            textViewTemperatureNumber.setText("" +ds.getTemperature());
            textViewHumidityNumber.setText(""+ds.getHumidity());

        }

        @Override
        public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
            ERDataStructure ds = dataSnapshot.getValue(ERDataStructure.class);
            textViewTemperatureNumber.setText("" +ds.getTemperature());
            textViewHumidityNumber.setText(""+ds.getHumidity());
        }

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

        }

        @Override
        public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

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

        }
    });
    myRef.addValueEventListener(new ValueEventListener() {

        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            List<ERDataStructure> arraylist = new ArrayList<ERDataStructure>();
            if (dataSnapshot != null && dataSnapshot.getValue() != null){
                //FirebaseUser user = mAuth.getCurrentUser();
                //String userID = user.getUid();
                for (DataSnapshot a : dataSnapshot.getChildren()){

                    ERDataStructure dataStructure = new ERDataStructure();
                    dataStructure.setTemperature(a.getValue(ERDataStructure.class).getTemperature());
                    dataStructure.setHumidity(a.getValue(ERDataStructure.class).getHumidity());
                    arraylist.add(dataStructure);
                }
            }
        }

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

        }
    });
}
}

错误记录在

ERDataStructure ds = dataSnapshot.getValue(ERDataStructure.class);

编辑:向我的数据库添加另一个级别后,它设法运行

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    你需要使用ValueEventListener而不是ChildEventListener,所以改成这样:

    myRef = mFirebaseDatabase.getReference().child(userID).child("ERDataStructure");
    
    myRef.addValueEventListener(new ValueEventListener() {
       @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
       ERDataStructure ds = dataSnapshot.getValue(ERDataStructure.class);
     }
       @Override
    public void onCancelled(DatabaseError databaseError) {
       }
    });
    

    在这种情况下,您使用ValueEventListener,因为当您使用childEventListener 时,您基本上是在此快照中循环,并将humidity 的值作为String 类型返回。这就像在valueventlistener 中循环dataSnapshot.getChildren()

    【讨论】:

      猜你喜欢
      • 2018-05-22
      • 2018-07-27
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      • 2021-07-16
      • 2018-07-08
      • 1970-01-01
      相关资源
      最近更新 更多