【问题标题】:All where filters with an inequality (Firestore - Java)所有带有不等式的过滤器(Firestore - Java)
【发布时间】:2021-02-02 20:35:31
【问题描述】:

长话短说,我正在为火车时间戳制作应用程序,因此我有一个云 Firestore 数据库作为我的数据库。问题的关键在于,当用户找到特定的出发时间时,我使用 whereGreaterThanOrEqualTo 来搜索时间,即特定的分钟和小时。如果用户尝试查找 8:30 的路线,则应用程序应返回到该时间附近的下一条路线。但是当用户点击找到路线时,应用程序崩溃了......这是错误:

java.lang.RuntimeException: 无法启动活动 ComponentInfo{com.example.projekatidemovozom/com.example.projekatidemovozom.SecondActivity}: java.lang.IllegalArgumentException: All where 过滤器不等式(notEqualTo、notIn、lessThan、lessThanOrEqualTo 、greaterThan 或greaterThanOrEqualTo) 必须在同一字段上。但是您在“departure.hours”和“departure.minutes”上有过滤器

这是我从数据库中获取数据的代码:

public void initDatabaseConnection() {
        FirebaseFirestore db = FirebaseFirestore.getInstance();
        CollectionReference timestampsRef = db.collection("timestamps");
        timestampsRef.whereEqualTo("route.cityFrom", cityOd)
                .whereEqualTo("route.cityTo", cityDo)
                .whereGreaterThanOrEqualTo("departure.hours", hours) //ISSUE LINE
                .whereGreaterThanOrEqualTo("departure.minutes", minutes) //ISSUE LINE
                .get()
                .addOnCompleteListener(task -> {
                    if (task.isSuccessful()) {
                        for (QueryDocumentSnapshot document : task.getResult()) {
                            TimestampModel tm = document.toObject(TimestampModel.class);
                            timestampModelList.add(tm);
                            Log.d(TAG, tm.toString());
                        }
                    } else {
                        Log.w(TAG, "Error getting documents.", task.getException());
                    }
                });
    }

这是我的数据库结构:

那么你知道是什么问题吗?

【问题讨论】:

  • 例外情况似乎很明显:你不能在不同的字段上有两个whereGreaterThanOrEqualTo 语句。 TBH,我不认为您的查询按预期工作 - 9:00 将不匹配,因为 0 小于 30 分钟。为什么小时和分钟是不同的字段?
  • 最后一部分实际上是一个很好的解决方案@ianhanniballake,因为它允许使用不同(单字段)查询的用例。你能写出来作为答案吗?否则很可能这将作为同一错误消息中另一个问题的重复而被关闭。
  • 啊,好吧,我没注意到不能有两个whereGreaterThanOrEqualTo 语句。谢谢,我为这个答案竖起了大拇指:) @ianhanniballake 我想将其设置为答案,但我不能... :( @FrankvanPuffelen

标签: java android firebase google-cloud-firestore


【解决方案1】:

异常状态:

具有不等式(notEqualTo、notIn、lessThan、lessThanOrEqualTo、greaterThan 或 greaterThanOrEqualTo)的所有 where 过滤器必须位于同一字段中。但是您在“departure.hours”和“departure.minutes”上有过滤器

因此,您不能在不同的字段(您的小时和分钟字段)上有两个 whereGreaterThanOrEqualTo 语句。

事实上,将时间表示为两个字段意味着您的查询无法按预期工作,因为如果您查询 8:30,9:00 的时间将不匹配,因为 0 小于 30。

相反,请考虑使用单个字段来表示时间(例如,从午夜开始的分钟数),这意味着您可以只使用一个 whereGreaterThanOrEqualTo

【讨论】:

  • 感谢您的回答。所以我应该将时间用作单个字段字符串?然后我可以应用whereGreaterThanOrEqualTo 方法对吗?
  • “自午夜以来的分钟数”,我的建议,将是一个整数值。您真的想比较时间的整数值,而不是字符串。
  • 嗯好吧,我还没想好。谢谢你的回答:)
猜你喜欢
  • 2021-10-21
  • 2019-11-10
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
相关资源
最近更新 更多