【问题标题】:DatabaseException in firebase androidFirebase android中的DatabaseException
【发布时间】:2021-02-23 06:02:36
【问题描述】:

我是 Android 应用程序开发的新手。我正在尝试从 Firebase 检索数据,但我无法将转换字符串键入用户定义的对象。首先它给了我 ClasscastException 它无法将字符串转换为用户定义的对象。

这是我的代码:

MainActivity.java

public class MainActivity3 extends AppCompatActivity implements View.OnClickListener {

    FirebaseDatabase db = FirebaseDatabase.getInstance();
    DatabaseReference databasereference;
    ListView l1;
    List<User> names;
    ArrayAdapter<User>arrayAdapter;
    Button b;
    User u = new User();

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

        l1 = findViewById(R.id.listvw);
        b = findViewById(R.id.list_button);

        b.setOnClickListener(this);
 }

public void onClick(View view)
{
     retrieve_data();
}

public void retrieve_data()
    {
        databasereference = db.getReference("User");
        names = new ArrayList<>();
        arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, names);
        databasereference.addValueEventListener(new ValueEventListener() {

           // User u1,u2;

           // String s1,s2;
            public void onDataChange(DataSnapshot datasnapshot) {
                try {
                    names.clear();
                    for (DataSnapshot ds : datasnapshot.getChildren()) {
                      User u1=(User) ds.child("name").getValue(User.class);
                    User u2 =(User) ds.child("contact").getValue(User.class);
                   names.add(u1);
                   names.add(u2);                        
                   }
                   l1.setAdapter(arrayAdapter);

                } catch (Exception e) {
                    // Toast.makeText(this,"failed",Toast.LENGTH_SHORT).show();
                    e.printStackTrace();
                }
        }
            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
    }
}

用户.java

public class User
{
    String name;
    String contact;
    String id;
    String tmp;

    public User() {
    }


    public User(String name,String contact,String id) {
        this.name = name;
        this.contact = contact;
        this.id = id;
    }

    public User(String tmp)
    {
        this.tmp=tmp;
    }
    public User(String name,String id) {
        this.name = name;
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getContact() {
        return contact;
    }

    public void setContact(String contact) {
        this.contact = contact;

    }

}

database structure in firebase

异常详情:

 com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.firebase_smpl.User
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:436)
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232)
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80)
    at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:203)
    at com.example.firebase_smpl.MainActivity3$1.onDataChange(MainActivity3.java:118)
    at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75)
    at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63)
    at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5628)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:853)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:737)

有人,请帮助我。我被困在这里了。

注意: 我改变了这一行: 用户 u1=(User) ds.child("name").getValue(User.class); 到这一行: User u1=ds.getValue(User.class); 根据建议,但它给了我上述错误:

Firebase list output

【问题讨论】:

  • 请编辑您的问题,将您的数据库结构添加为 JSON 文件或至少是屏幕截图。
  • 是的,我已经添加了数据库结构的图像,请查看

标签: java android firebase exception firebase-realtime-database


【解决方案1】:

应该是……

公共类用户实现可序列化

用户用户 = ds.getValue(User.class); // ds 将是您的任何数据快照节点

【讨论】:

  • 还是不行。它抛出了同样的异常。我已经编辑了代码再次检查它。
【解决方案2】:

您收到以下错误:

com.google.firebase.database.DatabaseException:无法将 java.lang.String 类型的对象转换为 com.example.firebase_smpl.User 类型

最有可能出现在这行代码中:

User u1=(User) ds.child("name").getValue(User.class);

这是因为ds.child("name") 返回一个字符串和而不是一个用户对象。如果你需要获取你的User节点下的每一个User对象,那么请将上面这行代码改成:

User u1 = ds.getValue(User.class);

根本不需要演员表的地方。如果只需要获取名称,请改为:

String name = ds.child("name").getValue(String.class);

【讨论】:

  • 你好!现在我面临着我在问题中添加的新问题。
  • 当遇到新问题时,最好发布新问题。但是,您会得到这种行为,因为您显示了内存中的地址。要解决这个问题,只需在 User 类中重写 toString() 方法,以返回例如名称。
  • 怎么做?你能告诉我吗?
  • 您可以查看this。
猜你喜欢
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
相关资源
最近更新 更多