【问题标题】:Can't convert object of type java.lang.String to type无法将 java.lang.String 类型的对象转换为类型
【发布时间】:2018-07-14 21:51:26
【问题描述】:

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

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

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

和代码:

主要活动代码:

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 表中获取最后一项。

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

有人可以给我建议吗?

【问题讨论】:

标签: android firebase firebase-realtime-database


【解决方案1】:

在您的第一个代码 sn-p 中,您从数据库的根目录读取。由于您正在尝试阅读订单,因此您应该改为阅读 /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

【讨论】:

  • 现在可以了。仍然有一条红线写着E/RecyclerView: No adapter attached; skipping layout,但我稍后会找出原因。谢谢。
【解决方案2】:

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

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

【讨论】:

  • 我在 Order 类中没有函数 getId()。如果我定义该函数,订单名称,我应该返回什么?如果我使用那个 for() 循环,我会得到同样的错误,不幸的是。
猜你喜欢
  • 2017-03-19
  • 2021-07-16
  • 2018-07-08
  • 1970-01-01
  • 2018-05-22
  • 2020-12-24
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多