无法将类型为java.lang.String的对象转换为type [英] Can't convert object of type java.lang.String to 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屋!