此刻,我设法将date
字段添加到模型Target
中。
您可以在屏幕上看到的结构:
我还有一个片段在其中显示日历。如何通过单击日期来判断是否有针对该日期创建的目标?
class CalendarFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_calendar, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupViews()
}
private fun setupViews() {
calendarView.setOnDateChangeListener { view, year, month, dayOfMonth ->
dateView.text = //name of Target
}
}
}
例如,现在我在日历中仅显示带有下一个代码的日期:
dateView.text = "Selected date is " + dayOfMonth + "/" + (month + 1) + "/" + year
问:如何显示特定日期的目标名称?
UPD: 现在,我将这段代码插入片段中,该片段是我从answer中提取的:
val uid = FirebaseAuth.getInstance().currentUser!!.uid
val rootRef = FirebaseDatabase.getInstance().reference
val targetsRef = rootRef.child("targets").child("users").child(uid).child("targets")
val query = targetsRef.orderByChild("date")
val valueEventListener = object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
for (ds in dataSnapshot.children) {
val name = ds.child("name").getValue(String::class.java)
Log.d("some", name)
}
}
override fun onCancelled(databaseError: DatabaseError) {
Log.d("some", databaseError.getMessage()) //Don't ignore errors!
}
}
query.addListenerForSingleValueEvent(valueEventListener)
但是现在当我进入片段时,无论日历中选择的日期如何,我都会获得创建的所有目标的名称。
答案 0 :(得分:1)
根据之前的评论,您确认有人在日历中单击某个日期以使用该日期查询targets
节点以查找一个或多个结果时需要。但首先要注意。
出于搜索目的,可以将date
作为字符串存储,因为您可以使用比较whereEqualTo()
方法,但是如果要对结果进行排序,则自{{ 3}}。因此,您可以考虑将date
作为ServerValue.TIMESTAMP
存储,如以下帖子中我的回答所述:
此外,我将为您提供特定用途的解决方案,其中date
是一个字符串,但是如果您考虑使用上述解决方案,可以稍后对其进行更改。因此,我将使用以下字符串作为选定日期:
val selectedDate = "24 October 2019"
假设此值来自您选择日历中的日期,请尝试以下代码:
val uid = FirebaseAuth.getInstance().currentUser!!.uid
val rootRef = FirebaseDatabase.getInstance().reference
val targetsRef = rootRef.child("targets").child("users").child(uid).child("targets")
val query = targetsRef.orderByChild("date").equalTo(selectedDate)
val valueEventListener = object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
for (ds in dataSnapshot.children) {
val name = ds.child("name").getValue(String::class.java)
Log.d(TAG, name)
}
}
override fun onCancelled(databaseError: DatabaseError) {
Log.d(TAG, databaseError.getMessage()) //Don't ignore errors!
}
}
query.addListenerForSingleValueEvent(valueEventListener)
在这种情况下,您的logcat中的结果将是:
target
编辑:
无论日历中选择的日期如何,我都会获得创建的所有目标的名称。
您得到所有日期,因为您忘记了致电.equalTo(selectedDate)
。所以请更改:
val query = targetsRef.orderByChild("date")
到
val query = targetsRef.orderByChild("date").equalTo(selectedDate)