Невозможно отобразить данные дочернего узла в FirebaseRecyclerView.DatabaseException: невозможно преобразовать объект в имя класса - PullRequest
0 голосов
/ 29 января 2019

Мне нужно отобразить список (данные из базы данных Firebase в реальном времени, связанные с RecyclerView), который находится в корне -> История -> UID -> местоположение, дата.В настоящее время я могу отображать только данные в разделе «История».Проблема возникает, когда я пытаюсь отфильтровать узел History к дочернему узлу UID и выдает следующую ошибку:

com.google.firebase.database.DatabaseException: Невозможно преобразовать объектвведите java.lang.String для ввода com.example.ModelHistory

Вот мой ModelHistory.class:

public class ModelHistory {

String location, date;

// Constructor
public ModelHistory() {

}

public String getLocation() {
    return location;
}
// It shows a warning here that setLocation is never used
public void setLocation(String location) {
    this.location = location;
}

public String getDate() {
    return date;
}

public void setDate(String date) {
    this.date = date;
}
}

Вот мой RecentHistory.java:

public class RecentHistory extends AppCompatActivity {

    RecyclerView mRecyclerView;
    FirebaseDatabase mFirebaseDatabase;
    DatabaseReference mRef, uidRef;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recent_history);

        // Set ActionBar
        ActionBar actionBar = getSupportActionBar();
        actionBar.setTitle("History");

        mRecyclerView = findViewById(R.id.rvHistory);
        mRecyclerView.setHasFixedSize(true);


        // Set Layout
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));


        // Send Query to Firebase Db
        mFirebaseDatabase = FirebaseDatabase.getInstance();
        String currentuser = FirebaseAuth.getInstance().getCurrentUser().getUid();

        mRef = mFirebaseDatabase.getReference("History");
        uidRef = mRef.child(currentuser);
        Log.d("TAG", uidRef.toString());

    }

    @Override
    protected void onStart() {
        super.onStart();
        FirebaseRecyclerAdapter<ModelHistory, ViewHolder> firebaseRecyclerAdapter =
                new FirebaseRecyclerAdapter<ModelHistory, ViewHolder>(
                        ModelHistory.class,
                        R.layout.historyrow,
                        ViewHolder.class,
                        mRef
                        //uidRef  //  Error when I replace this with mRef
                ) {
                    @Override
                    protected void populateViewHolder(ViewHolder viewHolder, ModelHistory model, int position) {
                        viewHolder.setHistoryDirectory(getApplicationContext(), model.getLocation(), model.getDate());
                    }

                    @Override
                    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                        ViewHolder viewHolder = super.onCreateViewHolder(parent, viewType);
                        return viewHolder;
                    }
                };
        // Set adapter to recycler view
        mRecyclerView.setAdapter(firebaseRecyclerAdapter);

    }
}

Пожалуйста, дайте мне знать, если нужен xml, я его отредактирую.

1 Ответ

0 голосов
/ 29 января 2019

Вы получаете следующую ошибку:

com.google.firebase.database.DatabaseException: Невозможно преобразовать объект типа java.lang.String в тип com.example.ModelHistory

Поскольку это правильное поведение, когда вы передаете uidRef конструктору FirebaseRecyclerAdapter.

В настоящее время я могу отображать только данные в разделе История.

Это происходит потому, что ваш адаптер определен как FirebaseRecyclerAdapter<ModelHistory, ViewHolder>, что означает, что он должен загружать все объекты типа ModelHistory, которые он находит по вашей ссылке mRef, что на самом делеверно.Все объекты, существующие по этой ссылке, имеют тип ModelHistory.

Проблема возникает, когда я пытаюсь отфильтровать узел History к дочернему узлу UID

Вы не можете просто изменить ссылку и ожидать, что результаты будут отфильтрованы таким образом, потому что ваш адаптер по-прежнему имеет тип ModelHistory, а не тип String.Таким образом, при использовании ссылки uidRef это означает, что вы пытаетесь загрузить все объекты типа ModelHistory ниже этой ссылки, которые, очевидно, not выходы.В root -> History -> UID существуют только свойства типа String (location and date), и поэтому вы получаете эту ошибку.

Если вы хотите отфильтровать эти данные, вы должны создать запрос, который может выглядеть следующим образом:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference hisotryRef = rootRef.child("History");
Query query = hisotryRef.orderByChild("location").equalTo("Test");

И результатом в вашем RecyclerView будет только один элемент, который в этом случае является последним, тот, у которого свойство location содержит Test.

Кроме этого,вы используете старую версию библиотеки Firebase-UI .Я рекомендую вам обновить до последней версии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...