Android Can';t将java.lang.String类型的对象转换为
在将另一个表添加到firebase数据库后出现问题。它给了我以下错误: com.google.firebase.database.DatabaseException:无法将java.lang.String类型的对象转换为 这是我的代码,如果我有这样的数据库,它可以正常工作: 和代码: 主要活动代码:Android Can';t将java.lang.String类型的对象转换为,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,在将另一个表添加到firebase数据库后出现问题。它给了我以下错误: com.google.firebase.database.DatabaseException:无法将java.lang.String类型的对象转换为 这是我的代码,如果我有这样的数据库,它可以正常工作: 和代码: 主要活动代码: rvOrder = (RecyclerView) findViewById(R.id.rvOrders); rvOrder.setLayoutManager(new LinearLayoutMan
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;
}
到
在firebasehelper中:
for(DataSnapshot ds : dataSnapshot.getChildren()) {
System.out.println(ds.getValue(Order.class));
Order order = ds.getValue(Order.class);
orders.add(order);
}
到
然后我可以向数据库中添加其他表,但我只从Orders表中获取最后一项
我想向数据库中添加多个包含多个项目的表,还想从“Orders”表中获取所有项目
有人能给我提些建议吗?我认为您需要相应地更新此方法:
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);
致:
此外,要检索所有订单,请继续使用增强循环:
for(DataSnapshot ds : dataSnapshot.getChildren()) {
System.out.println(ds.getValue(Order.class));
Order order = ds.getValue(Order.class);
orders.add(order);
}
我认为您需要相应地更新此方法:
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);
致:
此外,要检索所有订单,请继续使用增强循环:
for(DataSnapshot ds : dataSnapshot.getChildren()) {
System.out.println(ds.getValue(Order.class));
Order order = ds.getValue(Order.class);
orders.add(order);
}
在第一个代码段中,从数据库的根目录中读取。由于您正在尝试读取订单,因此应改为读取
/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);
}
最后一步需要将
firebaseheloper.orders
public,并且在从数据库根目录读取的第一个代码段中,某些变量可能必须是final
。由于您正在尝试读取订单,因此应改为读取/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);
}
最后一步需要将
firebaseheloper.orders
public,并且可能有些变量必须是final
我在Order类中没有函数getId()。如果我定义了函数ordername,我应该返回什么?不幸的是,如果我使用for()循环,我会得到同样的错误。Order类中没有函数getId()。如果我定义了函数ordername,我应该返回什么?不幸的是,如果我使用for()循环,我会得到同样的错误。在你的问题中有一些代码。你能把它简化成吗?你的问题中有一点代码。你能把它缩小到最小吗?现在它可以工作了。仍然有一条红线显示E/RecyclerView:未连接适配器;跳过布局
,但稍后我会找出原因。谢谢你,现在可以了。仍然有一条红线显示E/RecyclerView:未连接适配器;跳过布局
,但稍后我会找出原因。非常感谢。