无法在FirebaseRecyclerView中显示子节点数据。 DatabaseException:无法将对象转换为类名

时间:2019-01-29 10:29:29

标签: java android firebase firebase-realtime-database android-recyclerview

我需要显示一个列表(来自Firebase实时数据库的数据绑定到RecyclerView中),该列表位于根目录->历史记录-> UID->位置,日期。我目前只能在“历史记录”下显示所有数据。当我尝试将“历史记录”节点过滤到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;
}
}

这是我的LatestHistory.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 :(得分:2)

您遇到以下错误:

  

com.google.firebase.database.DatabaseException:无法将java.lang.String类型的对象转换为com.example.ModelHistory类型

因为当您将uidRef传递给FirebaseRecyclerAdapter构造函数时,这是正确的行为。

  

我目前只能在“历史记录”下显示所有数据。

之所以会这样,是因为您的适配器定义为FirebaseRecyclerAdapter<ModelHistory, ViewHolder>,这意味着它应该加载在您的ModelHistory引用下找到的所有类型mRef的对象,而实际上正确。在该引用下存在的所有对象的类型均为ModelHistory

  

当我尝试将“历史记录”节点过滤到UID的子节点时,会出现问题

您不能简单地更改引用并期望以这种方式过滤结果,因为您的适配器仍然是ModelHistory类型,而不是String类型。因此,在使用uidRef引用时,这意味着您试图在该引用下加载所有类型为ModelHistory的对象,显然退出。在root -> History -> UID下仅存在字符串类型(location and date)的属性,这就是为什么会出现该错误的原因。

如果要过滤该数据,则应创建一个如下所示的查询:

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

您的RecyclerView中的结果将只有一项,在本例中为最后一项,其位置属性为Test

除此之外,您正在使用旧版本的Firebase-UI Library。我建议您更新到最新版本。