Невозможно преобразовать объект типа java.lang.String в тип

У меня возникла проблема после добавления еще одной таблицы в базу данных firebase. это дает мне следующую ошибку:

com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type ...

вот мой код, который отлично работает, если у меня есть такая база данных: Невозможно преобразовать объект типа 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;
}

Если я изменю свой код на этот (который я видел в этом вопросе ссылка на вопрос):

по Основному направлению деятельности:

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

то я могу добавить другие таблицы в базу данных, но я получаю только последний элемент из таблицы «Заказы».

Я хочу добавить в базу данных много таблиц с несколькими элементами, а также получить все элементы из таблицы «Заказы».

Кто-нибудь может мне что-нибудь предложить?

В вашем вопросе немного кода. Можете ли вы уменьшить его до минимальный полный код, воспроизводящий ошибку?

Frank van Puffelen 14.07.2018 15:45
0
1
1 558
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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);
}

У меня нет функции getId () в классе Order. Что мне вернуть, если я определю эту функцию, название заказа? Если я использую этот цикл for (), я, к сожалению, получаю ту же ошибку.

tsogam 14.07.2018 13:18
Ответ принят как подходящий

В вашем первом фрагменте кода вы читаете из корня базы данных. Поскольку вы пытаетесь читать заказы, вам следует вместо этого читать из /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, но я выясню причину позже. Спасибо.

tsogam 14.07.2018 16:55

Другие вопросы по теме

Похожие вопросы

Android: Nougat отключает соединение для передачи данных при выключенном экране, что не позволяет фоновой службе отправлять обновление loaction на сервер
React Native Run Android
Как получить все данные ребенка в firebase и показать их в моем приложении для Android?
В обоих случаях либо приложение закрыто, либо на переднем плане нам нужно получить уведомление
Как повторить один и тот же запрос API несколько раз с разными параметрами и выполнить второй сетевой вызов для отправки этих данных обратно на сервер с помощью RxJava
Перезапуск службы после перезагрузки с помощью Broadcastreceiver не работает
Значок запуска приложений изменен на значок по умолчанию в Oreo
Загружать изображения с SD-карты в веб-просмотре
Начать активность, даже когда экран выключен
Для вызова требуется разрешение, которое может быть отклонено пользователем: код должен явно проверять, доступно ли разрешение