【问题标题】:How to implement multiple order by in android firestore based on different if conditions?如何根据不同的if条件在android firestore中实现多订单?
【发布时间】:2018-08-23 10:26:08
【问题描述】:

AndroidFirestore中如何根据不同的if条件实现多个order by?

我想根据不同的字段值对我的 firestore 项目进行排序 像这样:

Query query= firestoredb.collection('items').document(docid).orderby('price').orderby('itemcategory').orderby('name**');

但是会添加多少orderby动态的。它将在运行时决定,即用户将从排序选项中选择什么。

那么我将如何在 android 中进行 Firestore 查询?

请帮帮我。

【问题讨论】:

    标签: java android firebase google-cloud-firestore


    【解决方案1】:

    类似于您在代码中使用的查询:

    Query query= firestoredb.collection('items').document(docid).orderby('price').orderby('itemcategory').orderby('name');
    

    在 Cloud Firestore 中是不可能的,因为 firestoredb.collection('items').document(docid) 返回一个 DocumentReference 对象并且您不能在其上调用 orderBy() 方法。所以假设你要使用查询,下面这行代码:

    Query query= firestoredb.collection('items').orderby('price').orderby('itemcategory').orderby('name');
    

    可以正常工作。 Firestore 中按多个字段排序没有问题。您甚至可以将传递的方向设置为第二个参数:Direction.ASCENDINGDirection.DESCENDING

    编辑:

    根据您的评论,您应该创建一个 if 语句,甚至更好的是一个 switch 语句,并根据用户选择的内容创建一个 new 查询对象。所以如果用户只选择价格,那么查询应该是这样的:firestoredb.collection('items').orderby('price'),就是这样。请参阅下面的示例:

    Query query;
    switch (option) {
        case "price":
            query = firestoredb.collection('items').orderby('price');
            break;
        case "itemcategory":
            query = firestoredb.collection('items').orderby('itemcategory');
            break;
        case "price_itemcategory":
            query = firestoredb.collection('items').orderby('price').orderby('itemcategory');
            break;
        case "name":
            query = firestoredb.collection('items').orderby('name');
            break;
        case "price_name":
            query = firestoredb.collection('items').orderby('price').orderby('name');
            break;
        default:
            query = firestoredb.collection('items'); //No ordering
            break;
    

    【讨论】:

    • 是的,我同意你的观点,在 Firestore 中按多个字段排序没有问题,但我的问题是我如何根据用户输入动态添加或删除我的 orderby 字段,即用户将从订单中选择什么通过选项?只能是 orderby('price') 可以是 orderby('itemcategory') 和 orderby('price') 也可以是 orderby('name') 和 orderby('price')
    • 在这种情况下,请参阅我的更新答案。现在可以了吗?
    • 谢谢它的工作,但使多种可能的案例组合使其更典型,而不是它我找到了另一种方式,就像 Query query=firestoredb.collection('items'); if('price') 查询 = query.orderby('price'); if('name') 查询 = query.orderby('name'); if('itemCategory') 查询 = query.orderby('itemCategory');
    • 这是典型的同一件事 :) 但很高兴听到它有效。
    • 我做了同样的事情,但它引发了“错误:9 FAILED_PRECONDITION:查询需要索引”的错误。帮助
    【解决方案2】:
     Query query=firestoredb.collection("items"); 
     if(PRICE.equals("price")) {
          query = query.orderby('price'); 
     }
     if(NAME.equals("name")) {
          query = query.orderby('name'); 
     }
     if("itemCategory"){
          query = query.orderby('itemCategory');
     }
    

    【讨论】:

    • 此解决方案与我的解决方案相同,只是您使用了if statement 而不是switch statement。主要区别在于您的代码无法解决您需要按两个属性订购的情况,就像您最初的请求一样。
    • 嗨@Alex,您在firebase集合中添加一个 orderby 并将其分配给 query 对象,并且在每个 case 语句中您都替换了 查询对象。此外,您正在使用多个 orderby 进行组合,即对于两个属性(名称,项目)必须有 4 个可能的案例语句,对于 3 个属性(名称,项目,类别)同样需要 6 个可能的案例语句需要,在这里在我的代码中,我将 orderby 与前一个 query 对象附加在一起,是的,我的代码解决了我需要按两个属性排序的情况,因为我的原始请求是。
    • 因此,如果您说您最初的问题是按两个属性排序,而我的答案解决了您的问题,为什么要接受一个甚至不包含一半解决方案的答案?这可能会使未来的访问者感到困惑。
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    相关资源
    最近更新 更多