我需要显示一个列表(来自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,我将对其进行编辑。
答案 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。我建议您更新到最新版本。