无法将类型java.lang.String的对象转换为type

时间:2018-07-14 10:02:42

标签: android firebase firebase-realtime-database

将另一个表添加到Firebase数据库后出现问题。它给了我以下错误:

  

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

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

和代码:

主要活动代码:

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助手代码:

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;
}

如果我将代码更改为此(我在问题link to the question中看到了):

在主要活动中:

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

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

以及在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表中获取最后一个项目。

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

有人可以建议我吗?

2 个答案:

答案 0 :(得分:1)

我认为您需要相应地更新此方法:

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;
}

尝试更改:

databaseReference.child("Orders").push().setValue(order);

收件人:

databaseReference.child("Orders").child(order.getId).setValue(order);

此外,要恢复所有订单,请继续使用增强型循环:

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

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

答案 1 :(得分:1)

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

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中进行了精确的操作,因此可以调用该方法:

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

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

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

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