database.DatabaseException:不能将java.lang.String类型的对象转换为类型 [英] database.DatabaseException: Can't convert object of type java.lang.String to type
问题描述
我的问题
08-10 04:23:28.820 21501-21501 / my.org.medicare.medicareapp E / AndroidRuntime:FATAL EXCEPTION:main
处理:my.org.medicare.medicareapp,PID:21501
com.google.firebase.database.DatabaseException:无法将java.lang.String类型的对象转换为在com.google.android.gms.internal.zzaln.zzd(未知来源)输入my.org.medicare.medicareapp.protest
(com.google.android.gms.internal.zzaln.zzb)
(未知来源)
在com.google.android.gms.internal.zzaln.zza(未知来源)
com.google.firebase.database.DataSnapshot.getValue(未知源)
在my.org.medicare.medicareapp.FirebaseHelper.fetchData(FirebaseHelper.java:50)
在my.org.medicare。 Medicareapp.FirebaseHelper.access $ 000(FirebaseHelper.java:14)
at my.org.medicare.medicareapp.FirebaseHelper $ 1.onChildAdded(FirebaseHelper.java:60)
com.google.android.gms。 internal.zzahe.zza(未知来源)
来自com.google.android.gms.internal.zzaje.zzcta(未知来源)
在com.google.android.gms.internal.zzajh $ 1.run(未知源)
在android.os.Handler.handleCallback(Handler.java:739)
在android.os.Handler.dispatchMessage (Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
My Main活动代码:
rv =(RecyclerView)findViewById(R.id.rv);
rv.setLayoutManager(新的LinearLayoutManager(this));
// INITIALIZE FIREBASE DB
db = FirebaseDatabase.getInstance()。getReference()。child(Pro);;
helper = new FirebaseHelper(db);
// ADAPTER
adapter = new MyAdapter(this,helper.retrieve());
rv.setAdapter(adapter);
和我的FirebaseHelper:
public class FirebaseHelper {
DatabaseReference db;
布尔值保存=空;
ArrayList< protest> spacecrafts = new ArrayList<>();
public FirebaseHelper(DatabaseReference db){
this.db = db;
//写入如果不是NULL
公共布尔值保存(抗议航天器)
{
if(spacecraft == null)
{
saved = false;
} else
{
try
{
db.child(Pro)。push()。setValue(spacecraft);
saved = true;
} catch(DatabaseException e)
{
e.printStackTrace();
saved = false;
}
}
返回保存;
//执行获取数据和填充数组
private void fetchData(DataSnapshot dataSnapshot)
{
spacecrafts.clear();
//dataSnapshot.getChildren()
for(DataSnapshot ds:dataSnapshot.getChildren())
{
protest spacecraft = ds.getValue(protest.class);
spacecrafts.add(航天器);
}
}
//读取返回列表
public ArrayList< protest> (){
db.addChildEventListener(new ChildEventListener(){
@Override $ b $ public void onChildAdded(DataSnapshot dataSnapshot,String s){
fetchData(dataSnapshot); $ b $ (DataSnapshot dataSnapshot,String s){
fetchData(dataSnapshot);
}
@Override
public void onChildRemoved (DataSnapshot dataSnapshot){
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot,String s){
}
@Override
public void onCancelled DatabaseError databaseError){
}
});
返回航天器;
$ b $ p $ My $持有者
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView nameTxt,propTxt,descTxt;
ItemClickListener itemClickListener;
public MyViewHolder(View itemView){
super(itemView);
nameTxt =(TextView)itemView.findViewById(R.id.nameTxt);
propTxt =(TextView)itemView.findViewById(R.id.propellantTxt);
descTxt =(TextView)itemView.findViewById(R.id.descTxt);
itemView.setOnClickListener(this);
}
public void setItemClickListener(ItemClickListener itemClickListener)
{
this.itemClickListener = itemClickListener;
}
@Override
public void onClick(View view){
this.itemClickListener.onItemClick(this.getLayoutPosition());
$ b 下面是我的数据结构,我试着读Pro
My Protest结构:
public class protest {
private String name;
私人字符串联系;
私人字符串中心;
public protest(){};
public String getName(){return name;}
public String getContact(){return contact;}
public String getCentre(){return center;}
public void setName(String name){
this.name = name;
}
public void setContact(String contact){
this.contact = contact;
}
public void setCentre(String center){
this.centre = center;
}
}
我可以知道问题所在吗?我是新来的firebase,我需要你的帮助。我在这里读了一些类似的问题,但我仍然无法解决我的问题。可以在这里的任何专家帮助我吗?
更新:
测试再次打印..
当Datasnapshot去
public ArrayList< protest> (){
db.addChildEventListener(new ChildEventListener(){
@Override $ b $ public void onChildAdded(DataSnapshot dataSnapshot,String s){
System.out.println(dataSnapshot。 getValue());
fetchData(dataSnapshot);
}
10 06:26:47.548 26700-26700 / my.org.medicare.medicareapp我/ System.out:{name = lee,contact = 123456,center = jalan ipoh}
<但是当Datasnapshot转到
$ b $ pre $ private $ fetchData(DataSnapshot dataSnapshot)
{
spacecrafts.clear ();
//dataSnapshot.getChildren()
for(DataSnapshot ds:dataSnapshot.getChildren())
{
System.out.println(ds.getValue()) ;
protest spacecraft = ds.getValue(protest.class);
spacecrafts.add(spacecraft);
}
}
08-10 06:26:47.54 8 26700-26700 / my.org.medicare.medicareapp I / System.out:jalan ipoh
问题是什么?
fetchData 函数已经接收到 DataSnapshot
作为一个子对象-node,但是即使在这里,你仍然循环通过将通过各个键循环的子元素( name
, contact
, center
)。
您应该简单地在 DataSnaphot
上调用 getValue
,而不循环:
private void fetchData(DataSnapshot dataSnapshot)
{
spacecrafts.clear();
protest spacecraft = dataSnapshot.getValue(protest.class);
spacecrafts.add(航天器);
}
我希望这有助于。
My Problem
08-10 04:23:28.820 21501-21501/my.org.medicare.medicareapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: my.org.medicare.medicareapp, PID: 21501
com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type my.org.medicare.medicareapp.protest
at com.google.android.gms.internal.zzaln.zzd(Unknown Source)
at com.google.android.gms.internal.zzaln.zzb(Unknown Source)
at com.google.android.gms.internal.zzaln.zza(Unknown Source)
at com.google.firebase.database.DataSnapshot.getValue(Unknown Source)
at my.org.medicare.medicareapp.FirebaseHelper.fetchData(FirebaseHelper.java:50)
at my.org.medicare.medicareapp.FirebaseHelper.access$000(FirebaseHelper.java:14)
at my.org.medicare.medicareapp.FirebaseHelper$1.onChildAdded(FirebaseHelper.java:60)
at com.google.android.gms.internal.zzahe.zza(Unknown Source)
at com.google.android.gms.internal.zzaje.zzcta(Unknown Source)
at com.google.android.gms.internal.zzajh$1.run(Unknown Source)
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:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
My Main Activity Code:
rv = (RecyclerView) findViewById(R.id.rv);
rv.setLayoutManager(new LinearLayoutManager(this));
//INITIALIZE FIREBASE DB
db = FirebaseDatabase.getInstance().getReference().child("Pro");;
helper = new FirebaseHelper(db);
//ADAPTER
adapter = new MyAdapter(this, helper.retrieve());
rv.setAdapter(adapter);
And my FirebaseHelper:
public class FirebaseHelper {
DatabaseReference db;
Boolean saved=null;
ArrayList<protest> spacecrafts=new ArrayList<>();
public FirebaseHelper(DatabaseReference db) {
this.db = db;
}
//WRITE IF NOT NULL
public Boolean save(protest spacecraft)
{
if(spacecraft==null)
{
saved=false;
}else
{
try
{
db.child("Pro").push().setValue(spacecraft);
saved=true;
}catch (DatabaseException e)
{
e.printStackTrace();
saved=false;
}
}
return saved;
}
//IMPLEMENT FETCH DATA AND FILL ARRAYLIST
private void fetchData(DataSnapshot dataSnapshot)
{
spacecrafts.clear();
//dataSnapshot.getChildren()
for (DataSnapshot ds : dataSnapshot.getChildren())
{
protest spacecraft=ds.getValue(protest.class);
spacecrafts.add(spacecraft);
}
}
//READ THEN RETURN ARRAYLIST
public ArrayList<protest> retrieve() {
db.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
fetchData(dataSnapshot);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
fetchData(dataSnapshot);
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return spacecrafts;
}
}
My view Holder
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView nameTxt,propTxt,descTxt;
ItemClickListener itemClickListener;
public MyViewHolder(View itemView) {
super(itemView);
nameTxt= (TextView) itemView.findViewById(R.id.nameTxt);
propTxt= (TextView) itemView.findViewById(R.id.propellantTxt);
descTxt= (TextView) itemView.findViewById(R.id.descTxt);
itemView.setOnClickListener(this);
}
public void setItemClickListener(ItemClickListener itemClickListener)
{
this.itemClickListener=itemClickListener;
}
@Override
public void onClick(View view) {
this.itemClickListener.onItemClick(this.getLayoutPosition());
}
Below is my data structure, I try to read "Pro"
My Protest structure:
public class protest {
private String name;
private String contact;
private String centre;
public protest(){};
public String getName(){return name;}
public String getContact(){return contact;}
public String getCentre(){return centre;}
public void setName(String name) {
this.name = name;
}
public void setContact(String contact) {
this.contact = contact;
}
public void setCentre(String centre) {
this.centre = centre;
}
}
May i know what is the problem? I am new to firebase and i need your help. I read some similar question here but i still can't solve my problem. Can any expert here help me?
Update:
Tested again with print..
when Datasnapshot go to
public ArrayList<protest> retrieve() {
db.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
System.out.println(dataSnapshot.getValue());
fetchData(dataSnapshot);
}
08-10 06:26:47.548 26700-26700/my.org.medicare.medicareapp I/System.out: {name=lee, contact=123456, centre=jalan ipoh}
But when Datasnapshot go to
private void fetchData(DataSnapshot dataSnapshot)
{
spacecrafts.clear();
//dataSnapshot.getChildren()
for (DataSnapshot ds : dataSnapshot.getChildren())
{
System.out.println(ds.getValue());
protest spacecraft=ds.getValue(protest.class);
spacecrafts.add(spacecraft);
}
}
08-10 06:26:47.548 26700-26700/my.org.medicare.medicareapp I/System.out: jalan ipoh
What is the problem?
解决方案 Your fetchData
function already receives DataSnapshot
as a child-node, but even here you still loop through the children which will effectively be looping through individual keys (name
, contact
, centre
).
You should simply call getValue
on DataSnaphot
without looping:
private void fetchData(DataSnapshot dataSnapshot)
{
spacecrafts.clear();
protest spacecraft=dataSnapshot.getValue(protest.class);
spacecrafts.add(spacecraft);
}
I hope this helps.
这篇关于database.DatabaseException:不能将java.lang.String类型的对象转换为类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文