firebase 查询 orderByChild().equalTo() android kotlin 的问题
Problem with firebase query orderByChild().equalTo() android kotlin
我有问题。在屏幕截图下方,您可以看到我的数据库的结构。我需要过滤关于两个字段的查询:subgroup
和 time
.
我写了下面的代码:
private fun readFromDatabase() {
ref?.orderByChild("time")
?.equalTo("12:00 - 13:30")
?.orderByChild("subgroup")
?.equalTo("first")
?.addValueEventListener(object: ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.exists()) {
val list = ArrayList<Day>()
for (daySnapshot in snapshot.children) {
val day = daySnapshot.getValue(Day::class.java)
list.add(day!!)
}
adapter.submitList(list)
}
}
override fun onCancelled(error: DatabaseError) {
}
})
}
但是,我收到错误:java.lang.IllegalArgumentException:您不能组合多个 orderBy 调用!
有什么不同的方法吗?
如其所说,您不能合并多个 orderBy 调用。您只需要用一个 orderBy 过滤掉结果。
private fun readFromDatabase() {
ref?.orderByChild("time")
?.equalTo("12:00 - 13:30")
?.addValueEventListener(object: ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.exists()) {
val list = snapshot.children
.map {snapshot -> snapshot.getValue(Day::class.java)!!}
.filter {day -> "first".equals(day.subgroup)}
如错误消息所述:
java.lang.IllegalArgumentException: You can't combine multiple orderBy calls
无法在单个查询中合并多个 orderByChild()
方法调用。 Firebase 实时数据库 仅 支持对单个子 属性.
的查询
要解决这个问题,您可以考虑创建一个包含这两个值的新字段。您的节点应如下所示:
Firebase-root
|
--- classRooms
|
- 0
|
--- time_subgroup: "12:00 - 13:30_first"
如您所见,time_subgroup
属性 结合了您要过滤的两个值。
但是有一个down-site。如果要对字符串进行排序,则顺序始终为 lexicographically.
与实时数据库不同,Cloud Firestore allows compound queries。所以我建议你试试看。因此,像下面这样的查询将在 Cloud Firestore 中完美运行,无需创建组合 属性.
classRoomsRef.whereEqualTo("time", "12:00 - 13:30").whereEqualTo("subgroup", "first")
我有问题。在屏幕截图下方,您可以看到我的数据库的结构。我需要过滤关于两个字段的查询:subgroup
和 time
.
我写了下面的代码:
private fun readFromDatabase() {
ref?.orderByChild("time")
?.equalTo("12:00 - 13:30")
?.orderByChild("subgroup")
?.equalTo("first")
?.addValueEventListener(object: ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.exists()) {
val list = ArrayList<Day>()
for (daySnapshot in snapshot.children) {
val day = daySnapshot.getValue(Day::class.java)
list.add(day!!)
}
adapter.submitList(list)
}
}
override fun onCancelled(error: DatabaseError) {
}
})
}
但是,我收到错误:java.lang.IllegalArgumentException:您不能组合多个 orderBy 调用!
有什么不同的方法吗?
如其所说,您不能合并多个 orderBy 调用。您只需要用一个 orderBy 过滤掉结果。
private fun readFromDatabase() {
ref?.orderByChild("time")
?.equalTo("12:00 - 13:30")
?.addValueEventListener(object: ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.exists()) {
val list = snapshot.children
.map {snapshot -> snapshot.getValue(Day::class.java)!!}
.filter {day -> "first".equals(day.subgroup)}
如错误消息所述:
java.lang.IllegalArgumentException: You can't combine multiple orderBy calls
无法在单个查询中合并多个 orderByChild()
方法调用。 Firebase 实时数据库 仅 支持对单个子 属性.
要解决这个问题,您可以考虑创建一个包含这两个值的新字段。您的节点应如下所示:
Firebase-root
|
--- classRooms
|
- 0
|
--- time_subgroup: "12:00 - 13:30_first"
如您所见,time_subgroup
属性 结合了您要过滤的两个值。
但是有一个down-site。如果要对字符串进行排序,则顺序始终为 lexicographically.
与实时数据库不同,Cloud Firestore allows compound queries。所以我建议你试试看。因此,像下面这样的查询将在 Cloud Firestore 中完美运行,无需创建组合 属性.
classRoomsRef.whereEqualTo("time", "12:00 - 13:30").whereEqualTo("subgroup", "first")