从 Firebase 检索数据:Firebase异常:无法退回到输入内容?



我正在构建一个从Firebase检索数据的应用程序。要显示 活动中的数据,我在移动到活动时收到错误 从Firebase获取数据。


以下是"人对象"的获取者和设置者

public class Person {
//name and address string
private String name;
private String address;
public Person() {
/*Blank default constructor essential for Firebase*/
}
//Getters and setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}

主类的Java代码..

public class Main2Activity extends AppCompatActivity {
private EditText editTextName;
private EditText editTextAddress;
private TextView textViewPersons;
private Button buttonSave;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
buttonSave = (Button) findViewById(R.id.buttonSave);
buttonSave = (Button) findViewById(R.id.buttonSave);
editTextName = (EditText) findViewById(R.id.editTextName);
editTextAddress = (EditText) findViewById(R.id.editTextAddress);
textViewPersons = (TextView) findViewById(R.id.textViewPersons);
Firebase.setAndroidContext(this);
//Click Listener for button
buttonSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Creating firebase object
Firebase ref = new Firebase(Config.FIREBASE_URL);
//Getting values to store
String name = editTextName.getText().toString().trim();
String address = editTextAddress.getText().toString().trim();
//Creating Person object
Person person = new Person();
//Adding values
person.setName(name);
person.setAddress(address);
//Storing values to firebase
ref.child("Person").setValue(person);
//Value event listener for realtime data update
ref.child("Person").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
for (DataSnapshot postSnapshot : snapshot.getChildren()) {
//Getting the data from snapshot
Person person = postSnapshot.getValue(Person.class);
//Adding it to a string
String string = "Name: "+person.getName()+"nAddress: "+person.getAddress()+"nn";
//Displaying it on textview
textViewPersons.setText(string);
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
System.out.println("The read failed: " + firebaseError.getMessage());
}
});
}
});
}

这是我的火力基地的截图。在此处输入图像描述

应用程序的崩溃日志

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.dell.database, PID: 22852
com.firebase.client.FirebaseException: Failed to bounce to type
at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:185)
at com.example.dell.database.Main2Activity$1$1.onDataChange(Main2Activity.java:60)
at com.firebase.client.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:45)
at com.firebase.client.core.view.DataEvent.fire(DataEvent.java:45)
at com.firebase.client.core.view.EventRaiser$1.run(EventRaiser.java:38)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5910)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class com.example.dell.database.Person] from String value; no single-String constructor/factory method
at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator._createFromStringFallbacks(StdValueInstantiator.java:428)
at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:299)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1056)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:136)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:123)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2888)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2034)
at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:183)
at com.example.dell.database.Main2Activity$1$1.onDataChange(Main2Activity.java:60) 
at com.firebase.client.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:45) 
at com.firebase.client.core.view.DataEvent.fire(DataEvent.java:45) 
at com.firebase.client.core.view.EventRaiser$1.run(EventRaiser.java:38) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5910) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200) 

I/进程:发送信号。PID: 22852 SIG: 9 应用程序已终止。

要显示名称和地址,请使用以下代码:

ref.child("Person").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
String name = postSnapshot.child("name").getValue(String.class);
String address = postSnapshot.child("address").getValue(String.class);
String string = "Name: "+name+"nAddress: "+address+"nn";
//Displaying it on textview
textViewPersons.setText(string);
}
@Override
public void onCancelled(FirebaseError firebaseError) {
System.out.println("The read failed: " + firebaseError.getMessage());
}
});

当您将人员写入数据库时,您将其编写为:

//Storing values to firebase
ref.child("Person").setValue(person);

这会在数据库中写入一个人,如控制台的屏幕截图所示。

然后读取数据时,您将执行以下操作:

ref.child("Person").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
for (DataSnapshot postSnapshot : snapshot.getChildren()) {
Person person = postSnapshot.getValue(Person.class);
String string = "Name: "+person.getName()+"nAddress: "+person.getAddress()+"nn";
//Displaying it on textview
textViewPersons.setText(string);
}
}

因此,您可以遍历Person节点的子节点。由于您只将一个人写入数据库,因此不需要该循环,并且实际上会破坏代码。要正确执行此操作,请删除循环:

public void onDataChange(DataSnapshot snapshot) {
Person person = postSnapshot.getValue(Person.class);
String string = "Name: "+person.getName()+"nAddress: "+person.getAddress()+"nn";
//Displaying it on textview
textViewPersons.setText(string);
}

顺便说一下,您使用的是相当旧版本的Firebase。我建议升级到更新的版本,即使只是因为您更有可能获得帮助。要升级,请查看此处:https://firebase.google.com/support/guides/firebase-android