Получение конкретного потомка для Firebase RecyclerView - PullRequest
0 голосов
/ 29 января 2019

Построение активности пользователей, пытаясь получить определенную информацию из базы данных (имя, проданные предметы и дату), получая ее из класса «Все пользователи» и моей ссылки на базу данных, и отображать ее в Recyclerview в моем приложении.

Моя база данных

enter image description here

Пробовал FirebaseUI-Android для этого https://github.com/firebase/FirebaseUI-Android/

МОЙ APP CRASH!

Мой код:

  @Override
    protected void onStart() {
        super.onStart();
        startListening();
    }

    public void startListening(){
        Query query = FirebaseDatabase.getInstance()
                .getReference()
                .child("Users")
                .limitToLast(50);

        FirebaseRecyclerOptions<ALL_USERS> options =
                new FirebaseRecyclerOptions.Builder<ALL_USERS>()
                        .setQuery(query, ALL_USERS.class)
                        .build();


        FirebaseRecyclerAdapter adapter = new FirebaseRecyclerAdapter<ALL_USERS, UsersViewHolder>(options) {

            @Override
            public UsersViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.users_card_layout, parent, false);

                return new UsersViewHolder(view);
            }

            @Override
            protected void onBindViewHolder(@NonNull UsersViewHolder usersViewHolder, int i, @NonNull ALL_USERS all_users) {
                usersViewHolder.setName(all_users.getName());
            }
        };

        mUsersList.setAdapter(adapter);
        adapter.startListening();


    }


    public static class UsersViewHolder extends RecyclerView.ViewHolder{

        View mView;


        public UsersViewHolder(View itemView) {
            super(itemView);

            mView=itemView;
        }

        public void setName(String name){
            TextView userNameView = mView.findViewById(R.id.Users_Name);
            userNameView.setText(name);
        }
    }


}

ВСЕ Пользователи:

public class ALL_USERS {

    public String name;
    public String SonyTV;
    public String Date;

    public ALL_USERS() {
    }

    public ALL_USERS(String name, String sonyTV, String date) {
        this.name = name;
        SonyTV = sonyTV;
        Date = date;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSonyTV() {
        return SonyTV;
    }

    public void setSonyTV(String sonyTV) {
        SonyTV = sonyTV;
    }

    public String getDate() {
        return Date;
    }

    public void setDate(String date) {
        Date = date;
    }
}

Мой LogCat:

E / AndroidRuntime: ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основной

    com.google.firebase.database.DatabaseException: Found two getters or fields with conflicting case sensitivity for property: date
        at com.google.firebase.database.obfuscated.zzbw$zza.zza(com.google.firebase:firebase-database@@16.0.3:545)
        at com.google.firebase.database.obfuscated.zzbw$zza.<init>(com.google.firebase:firebase-database@@16.0.3:476)
        at com.google.firebase.database.obfuscated.zzbw.zza(com.google.firebase:firebase-database@@16.0.3:317)
        at com.google.firebase.database.obfuscated.zzbw.zzb(com.google.firebase:firebase-database@@16.0.3:2418)
        at com.google.firebase.database.obfuscated.zzbw.zza(com.google.firebase:firebase-database@@16.0.3:79)
        at com.google.firebase.database.DataSnapshot.getValue(com.google.firebase:firebase-database@@16.0.3:212)
        at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:29)
        at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:15)
        at com.firebase.ui.common.BaseCachingSnapshotParser.parseSnapshot(BaseCachingSnapshotParser.java:35)
        at com.firebase.ui.common.BaseObservableSnapshotArray.get(BaseObservableSnapshotArray.java:52)
        at com.firebase.ui.database.FirebaseRecyclerAdapter.getItem(FirebaseRecyclerAdapter.java:106)
        at com.firebase.ui.database.FirebaseRecyclerAdapter.onBindViewHolder(FirebaseRecyclerAdapter.java:122)
        at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6673)
        at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6714)
        at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5647)
        at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5913)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5752)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5748)
        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2232)
        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1559)
        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1519)
        at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:614)
        at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3812)
        at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3529)
        at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4082)
        at android.view.View.layout(View.java:16962)
        at android.view.ViewGroup.layout(ViewGroup.java:5620)
        at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1189)
        at android.view.View.layout(View.java:16962)
        at android.view.ViewGroup.layout(ViewGroup.java:5620)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:396)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
        at android.view.View.layout(View.java:16962)
        at android.view.ViewGroup.layout(ViewGroup.java:5620)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:2001)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1844)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1753)
        at android.view.View.layout(View.java:16962)
        at android.view.ViewGroup.layout(ViewGroup.java:5620)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:396)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
        at android.view.View.layout(View.java:16962)
        at android.view.ViewGroup.layout(ViewGroup.java:5620)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:2001)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1844)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1753)
        at android.view.View.layout(View.java:16962)
        at android.view.ViewGroup.layout(ViewGroup.java:5620)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:396)
        at an

мой второй LogCat

com.google.firebase.database.DatabaseException: Failed to convert value of type java.lang.Long to String
    at com.google.firebase.database.obfuscated.zzbw.zzb(com.google.firebase:firebase-database@@16.0.3:2413)
    at com.google.firebase.database.obfuscated.zzbw.zzb(com.google.firebase:firebase-database@@16.0.3:178)
    at com.google.firebase.database.obfuscated.zzbw.zza(com.google.firebase:firebase-database@@16.0.3:47)
    at com.google.firebase.database.obfuscated.zzbw$zza.zza(com.google.firebase:firebase-database@@16.0.3:591)
    at com.google.firebase.database.obfuscated.zzbw.zzb(com.google.firebase:firebase-database@@16.0.3:2550)
    at com.google.firebase.database.obfuscated.zzbw.zza(com.google.firebase:firebase-database@@16.0.3:79)
    at com.google.firebase.database.DataSnapshot.getValue(com.google.firebase:firebase-database@@16.0.3:212)
    at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:29)
    at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:15)
    at com.firebase.ui.common.BaseCachingSnapshotParser.parseSnapshot(BaseCachingSnapshotParser.java:35)
    at com.firebase.ui.common.BaseObservableSnapshotArray.get(BaseObservableSnapshotArray.java:52)
    at com.firebase.ui.database.FirebaseRecyclerAdapter.getItem(FirebaseRecyclerAdapter.java:106)
    at com.firebase.ui.database.FirebaseRecyclerAdapter.onBindViewHolder(FirebaseRecyclerAdapter.java:122)
    at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6673)
    at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6714)
    at 

    android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5647)
        at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5913)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5752)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5748)
        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2232)
        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1559)
        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1519)
        at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:614)
        at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3812)
        at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3529)
        at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4082)
        at android.view.View.layout(View.java:16962)
        at android.view.ViewGroup.layout(ViewGroup.java:5620)
        at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1189)
        at android.view.View.layout(View.java:16962)
        at android.view.ViewGroup.layout(ViewGroup.java:5620)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:396)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
        at android.view.View.layout(View.java:16962)
        at android.view.ViewGroup.layout(ViewGroup.java:5620)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:2001)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1844)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1753)
        at android.view.View.layout(View.java:16962)
        at android.view.ViewGroup.layout(ViewGroup.java:5620)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:396)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
        at android.view.View.layout(View.java:16962)
        at android.view.ViewGroup.layout(ViewGroup.java:5620)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:2001)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1844)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1753)
        at android.view.View.layout(View.java:16962)
        at android.view.ViewGroup.layout(ViewGroup.java:5620)

1 Ответ

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

Проблема в вашем коде заключается в том, что в вашем классе ALL_USERS есть поле с именем Date, но вы используете геттер с именем getDate(), что неверно, поскольку Firebase ищет в базе данныхполе с именем date, а не Date.См. Строчную d букву против заглавной буквы D?

Существует два способа решения этой проблемы.Первым из них будет изменение класса вашей модели путем переименования полей в соответствии с Java Naming Conventions .Таким образом, ваш класс модели должен выглядеть следующим образом:

public class ALL_USERS {
    private String name, sonyTV;
    private long date;

    public ALL_USERS() {}

    public ALL_USERS(String name, String sonyTV, long date) {
        this.name = name;
        this.sonyTV = sonyTV;
        this.date = date;
    }

    public String getName() { return name; }
    public String getSonyTV() { return sonyTV; }
    public long getDate() { return date; }
}

Смотрите в этом примере, есть private поля и открытые методы получения.Существует также более простое решение - установить значение непосредственно в открытых полях, например так:

public class ALL_USERS {
    public String name, sonyTV;
    public long date;
}

Теперь просто удалите текущие данные и добавьте их снова, используя правильные имена.Это решение будет работать, только если вы находитесь на этапе тестирования.

Существует также второй подход, который заключается в использовании annotations.Поэтому, если вы предпочитаете использовать частные поля и общедоступные методы получения, вы должны использовать аннотацию PropertyName только перед объектом получения.Итак, ваш ALL_USERS класс должен выглядеть так:

public class ALL_USERS {
    private String name, SonyTV;
    private long Date;

    public ALL_USERS() {}

    public ALL_USERS(String name, String sonyTV, long date) {
        this.name = name;
        SonyTV = sonyTV;
        Date = date;
    }

    public String getName() { return mame; }
    @PropertyName("SonyTV")
    public String getSonyTV() { return SonyTV; }
    @PropertyName("Date")
    public long getDate() { return Date; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...