为什么这个 Android 应用不能将 Firebase 中的文本转换为字符串?

Why can't this Android app cast text from Firebase into strings?

我制作了一个简单的 Android 应用程序,它应该显示来自 Firebase 的文本。然而,我在将 Firebase 数据转换为字符串时遇到了问题。这是代码:

public class MainActivity extends AppCompatActivity {

  private Firebase ref;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Firebase.setAndroidContext(this);
    Firebase ref = new Firebase("xxx");
    final TextView textbox = (TextView) findViewById(R.id.textbox);
    Firebase.setAndroidContext(this);
    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String newCon = (String) dataSnapshot.getValue();
            textbox.setText(newCon);
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });
  }
}

我收到这些错误:

E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.ClassCastException: java.util.HashMap cannot be cast to java.lang.String
at com.example.elish_000.myfirstapp.MainActivity.onDataChange(MainActivity.java:43)

我运行应用程序时没有错误。然而,当我向 Firebase 添加文本时,应用程序崩溃而不是显示文本。

Firebase returns 默认情况下 HashMap 代表一个 JSON 对象。您可能正在寻找该对象中的 String 属性之一。

有两种方法可以解决这个问题。

1 - 使用 HashMap 并提取密钥。

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
   HashMap<String, Object> data = dataSnapshot.getValue();
   String newCon = data.get("newCon");
   textbox.setText(newCon);
}

2 - 创建类型安全的 class,并将 Firebase 数据反序列化为对象。

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
   MyClass theObject = snapshot.getValue(MyClass.class);
   textbox.setText(theObject.newCon);
}

我强烈推荐选项 2!

反序列化为 class 可能需要 多一点 前期。但是,它在类型安全和代码可读性方面带来了巨大的好处。

这里有一些使用 Firebase 检索数据的文档。 https://www.firebase.com/docs/android/guide/retrieving-data.html