У меня возникла проблема после добавления еще одной таблицы в базу данных firebase. это дает мне следующую ошибку:
com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type ...
вот мой код, который отлично работает, если у меня есть такая база данных:

и код:
Код основной деятельности:
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;
}
Если я изменю свой код на этот (который я видел в этом вопросе ссылка на вопрос):
по Основному направлению деятельности:
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);
то я могу добавить другие таблицы в базу данных, но я получаю только последний элемент из таблицы «Заказы».
Я хочу добавить в базу данных много таблиц с несколькими элементами, а также получить все элементы из таблицы «Заказы».
Кто-нибудь может мне что-нибудь предложить?
Думаю, вам нужно соответственно обновить этот метод:
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);
}
У меня нет функции getId () в классе Order. Что мне вернуть, если я определю эту функцию, название заказа? Если я использую этот цикл for (), я, к сожалению, получаю ту же ошибку.
В вашем первом фрагменте кода вы читаете из корня базы данных. Поскольку вы пытаетесь читать заказы, вам следует вместо этого читать из /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, но я выясню причину позже. Спасибо.
В вашем вопросе немного кода. Можете ли вы уменьшить его до минимальный полный код, воспроизводящий ошибку?