java - 将特定子项获取到 Firebase RecyclerView

标签 java android firebase firebase-realtime-database

构建用户 Activity ,尝试从数据库中检索特定信息(名称、已售出商品和日期),从所有用户类和我的数据库引用中获取此信息,并将其显示在我的应用程序上的 Recyclerview 中。

我的数据库

enter image description here

尝试了 FirebaseUI-Android https://github.com/firebase/FirebaseUI-Android/

我的应用程序崩溃了!

我的代码:

  @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:致命异常:main

    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)

最佳答案

代码中的问题在于,您的 ALL_USERS 类中有一个名为 Date 的字段,但您使用的是名为 getDate() 的 getter ,这是不正确的,因为 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)getter。还有一个更简单的解决方案,直接在公共(public)字段上设置值,如下所示:

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

现在只需删除当前数据并使用正确的名称再次添加即可。该解决方案仅在您处于测试阶段时才有效。

还有第二种方法,即使用注释。因此,如果您更喜欢使用私有(private)字段和公共(public) getter,则应该使用 PropertyName注释仅在 getter 前面。因此,您的 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; }
}

关于java - 将特定子项获取到 Firebase RecyclerView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54421047/

相关文章:

java - 调用方法Java

java问题添加/删除面板onclick

java - Spring Boot - 如何从依赖项中包含 REST 端点?

ios - 将 Firebase 数据合并到 TableView 中

java - LibGDX ScrollPane 显示黑屏

java - HashMap 不按添加顺序提供值

java - MjpegView 与其他 XML 布局

android - 识别用户是否在 Google Play 上购买应用程序的最佳方法

javascript - Firebase 函数 - 在用户获取中获取实时数据库后返回

ios - 在前台时不显示通知