无法将类型为java.lang.String的对象转换为type [英] Can't convert object of type java.lang.String to type

查看:49
本文介绍了无法将类型为java.lang.String的对象转换为type的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

将另一个表添加到我的Firebase数据库后,我遇到了问题.它给了我以下错误:

I have a problem after I add another table to my firebase database. it gives me following error:

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

com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type ...

这是我的代码,如果我有这样的数据库,它可以正常工作:

here is my code, which works fine if I have database like this:

和代码:

主要活动代码:

rvOrder = (RecyclerView) findViewById(R.id.rvOrders);
rvOrder.setLayoutManager(new LinearLayoutManager(this));

databaseReference= FirebaseDatabase.getInstance().getReference();
firebaseHelper=new FirebaseHelper(databaseReference);

myAdapter=new MyAdapter(this,firebaseHelper.retrieve());
rvOrder.setAdapter(myAdapter);

databaseReference.addValueEventListener(new ValueEventListener() {

    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        rvOrder.setAdapter(myAdapter);
        myAdapter.notifyDataSetChanged();
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
    }
});

Firebase助手代码:

Firebase helper code:

public class FirebaseHelper {

DatabaseReference databaseReference ;
Boolean saved = null;
ArrayList<Order> orders = new ArrayList<>();

public FirebaseHelper(DatabaseReference databaseReference) {
    this.databaseReference = databaseReference;
}

public Boolean save(Order order) {
    if (order == null) {
        saved = false;
    } else {
        try {
            databaseReference.child("Orders").push().setValue(order);
            saved = true;

        } catch (DatabaseException e) {
            e.printStackTrace();
            saved = false;
        }
    }
    return saved;
}

private void fetchData(DataSnapshot dataSnapshot) {
    orders.clear();

    for(DataSnapshot ds : dataSnapshot.getChildren()) {

        System.out.println(ds.getValue(Order.class));
        Order order = ds.getValue(Order.class);
        orders.add(order);
    }
}

public ArrayList<Order> retrieve() {
    databaseReference.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 orders;
}

如果我将代码更改为此(我在此问题中看到的

If I change my code to this (which I saw in this question link to the question ):

在主要活动中:

databaseReference= FirebaseDatabase.getInstance().getReference();

databaseReference= FirebaseDatabase.getInstance().getReference().child("Orders");

以及在firebasehelper中:

and in firebasehelper:

for(DataSnapshot ds : dataSnapshot.getChildren()) {
    System.out.println(ds.getValue(Order.class));
    Order order = ds.getValue(Order.class);
    orders.add(order);
}

System.out.println(dataSnapshot.getValue(Order.class));
Order order = dataSnapshot.getValue(Order.class);
orders.add(order);

然后我可以向数据库中添加另一个表,但是我只能从Orders表中获取最后一个项目.

then I am able to add another tables to database but I just get only the last item from the Orders table.

我想将包含多个项目的许多表添加到数据库中,并且我还想从订单"表中获取所有项目.

I want to add many tables with multiple items into the database and also I want to get all items from the "Orders" table.

有人可以建议我吗?

推荐答案

在您的第一个代码段中,您从数据库的根目录中读取了代码.由于您正在尝试读取订单,因此应改为从/Orders 读取:

In your first code snippet you read from the root of the database. Since you're trying to read orders, you should read from /Orders instead:

databaseReference= FirebaseDatabase.getInstance().getReference();
firebaseHelper=new FirebaseHelper(databaseReference);

//myAdapter=new MyAdapter(this,firebaseHelper.retrieve());
//rvOrder.setAdapter(myAdapter);

databaseReference.child("Orders").addValueEventListener(new ValueEventListener() {

现在,在您的 onDataChange 中,您可以通过循环阅读订单.由于您已经在 FirebaseHelper.fetchData 中进行了精确的操作,因此可以调用该方法:

Now in your onDataChange you can read the orders by looping over them. Since you already do precisely that in FirebaseHelper.fetchData, you can call that method:

public void onDataChange(DataSnapshot dataSnapshot) {
    firebaseHelper.fetchData(dataSnapshot);
}

现在剩下的就是将数据从 firebaseHelper.orders 连接到适配器和视图:

Now all that is left is to wire up the data from firebaseHelper.orders to an adapter and the view:

public void onDataChange(DataSnapshot dataSnapshot) {
    firebaseHelper.fetchData(dataSnapshot);
    myAdapter=new MyAdapter(this,firebaseHelper.orders);
    rvOrder.setAdapter(myAdapter);
}

最后一步将要求您公开 FirebaseHelper.orders ,并且可能某些变量必须是 final .

This last step will require that you make FirebaseHelper.orders public, and probably some of the variables must be final.

这篇关于无法将类型为java.lang.String的对象转换为type的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆