Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在Swift中的Firebase查询中应用多个筛选器?_Ios_Swift_Firebase_Firebase Realtime Database_Pagination - Fatal编程技术网

Ios 如何在Swift中的Firebase查询中应用多个筛选器?

Ios 如何在Swift中的Firebase查询中应用多个筛选器?,ios,swift,firebase,firebase-realtime-database,pagination,Ios,Swift,Firebase,Firebase Realtime Database,Pagination,我正在尝试开发一个应用程序,比如出租车预订和在Firebase上存储数据 但是,我在从Firebase查询RideDetail(历史)数据时遇到了问题 我想在分页表单中获取特定“客户id”的详细信息 我的Firebase数据结构: { "ride_details": { "NuEoP2WNPwigsbY1FQy9M150131918189233": { "customer_id": "tstebwLlf4OCRdWhNKO9XCO08xY2", "destin

我正在尝试开发一个应用程序,比如出租车预订和在Firebase上存储数据

但是,我在从Firebase查询RideDetail(历史)数据时遇到了问题

我想在分页表单中获取特定“客户id”的详细信息

我的Firebase数据结构:

{
  "ride_details": {
    "NuEoP2WNPwigsbY1FQy9M150131918189233": {
      "customer_id": "tstebwLlf4OCRdWhNKO9XCO08xY2",
      "destination_address": "New Ranip\nNew Ranip\nAhmedabad\nGujarat 380081\nIndia",
      "destination_lang": 72.55924470000001,
      "destination_latg": 23.0930152,
      "discount": "10%",
      "driver_id": "cIyZQIJ7tsdvF1a9KpRrKucF2o62",
      "drop_time": "2017-07-29 09:12:21 +0000",
      "fare": "13.16 Rs.",
      "payment_time": 150149034812771,
      "pickup_time": "2017-07-29 09:10:38 +0000",
      "priceperkm": "10.00 Rs.",
      "ride_confirm_time": "2017-07-29 09:06:21 +0000",
      "source_address": "Vastrapur\nVastrapur\nAhmedabad\nGujarat\nIndia",
      "source_lang": 72.5293244,
      "source_latg": 23.0350073,
      "tax": "10%"
    },
    "RH0oZ0Ypbkur3wJM3HMvM150147833457957": {
      "customer_id": "aYQFbwLlf4OCRdWhNKO9XCO08xY2",
      "destination_address": "Sarovar Park Plaza Hotels and Resorts Private Limted\nNo 1\nSector 10\nCBD Belapur\nWadala West\nWadala\nMumbai\nMaharashtra 400614\nIndia",
      "destination_lang": 72.8561644,
      "destination_latg": 19.0176147,
      "discount": 0,
      "driver_id": "cIyZQIJ7tsdvF1a9KpRrKucF2o62",
      "drop_time": "",
      "fare": 0,
      "payment_time": 150149034812772,
      "pickup_time": "",
      "priceperkm": 0,
      "ride_confirm_time": "2017-07-31 05:18:54 +0000",
      "source_address": "Smokin Joe's Fresh Pizza\nShop No. 2\n3\nGround Floor\nAbhiman II\nWadala West\nThane West\nMumbai\nMaharashtra 400602\nIndia",
      "source_lang": 72.8561644,
      "source_latg": 19.0176147,
      "tax": 0
    }
  }
}
这里的“付款时间”是付款完成时的时间戳

我想要的回答是:

{
    "RH0oZ0Ypbkur3wJM3HMvM150147833457957": {
      "customer_id": "aYQFbwLlf4OCRdWhNKO9XCO08xY2",
      "destination_address": "Sarovar Park Plaza Hotels and Resorts Private Limted\nNo 1\nSector 10\nCBD Belapur\nWadala West\nWadala\nMumbai\nMaharashtra 400614\nIndia",
      "destination_lang": 72.8561644,
      "destination_latg": 19.0176147,
      "discount": 0,
      "driver_id": "cIyZQIJ7tsdvF1a9KpRrKucF2o62",
      "drop_time": "",
      "fare": 0,
      "payment_type": 150149034812772,
      "pickup_time": "",
      "priceperkm": 0,
      "ride_confirm_time": "2017-07-31 05:18:54 +0000",
      "source_address": "Smokin Joe's Fresh Pizza\nShop No. 2\n3\nGround Floor\nAbhiman II\nWadala West\nThane West\nMumbai\nMaharashtra 400602\nIndia",
      "source_lang": 72.8561644,
      "source_latg": 19.0176147,
      "tax": 0
    },
    "1trcf0Ypbkur3wJM3HMvM150147833457957": {
      "customer_id": "aYQFbwLlf4OCRdWhNKO9XCO08xY2",
      "destination_address": "Sarovar Park Plaza Hotels and Resorts Private Limted\nNo 1\nSector 10\nCBD Belapur\nWadala West\nWadala\nMumbai\nMaharashtra 400614\nIndia",
      "destination_lang": 72.8561644,
      "destination_latg": 19.0176147,
      "discount": 0,
      "driver_id": "cIyZQIJ7tsdvF1a9KpRrKucF2o62",
      "drop_time": "",
      "fare": 0,
      "payment_type": 150149034812778,
      "pickup_time": "",
      "priceperkm": 0,
      "ride_confirm_time": "2017-07-31 05:18:54 +0000",
      "source_address": "Smokin Joe's Fresh Pizza\nShop No. 2\n3\nGround Floor\nAbhiman II\nWadala West\nThane West\nMumbai\nMaharashtra 400602\nIndia",
      "source_lang": 72.8561644,
      "source_latg": 19.0176147,
      "tax": 0
    } 
}

我希望在“付款时间”下通过查询orderedBy“payment\u time”传递的特定“customer\u id”的前10条记录。我还想做同样的分页。i、 e.在第二次查询调用中,它必须返回11-20条记录,以此类推。

有两种基本方法可以满足您的要求:

  • 构造一个查询,按
    payment\u time
    排序,限制只包括前10条记录,然后保留对第10条记录的引用,以便您可以使用
    querystartingavalue
    过滤器进行后续分页调用

  • 设置firebase cloud函数,使用数据库触发器监听
    支付时间
    节点,以便每次使用数据库中的值更新您的空sting时,您都会转换数据,以便以这样的方式组织数据,从而使在此处消费您的需求变得微不足道。例如,我将在如下路径组织新数据:
    customer\u-ride\u-details/{{customer\u-id}}/{{ride\u-id}
    。而且,由于您在用时间戳替换
    支付时间
    空字符串时触发了该函数。您应该已经订购了钥匙,以便使用。您仍然需要像处理选项1一样管理分页


  • 这个问题和评论有一些不同的标准,但让我在一个高层次上讨论它

    第一个答案是:不能先查询Firebase的一个子项值,然后再由另一个子项排序

    简单查询函数表示:

    let query = ridesRef.queryOrdered(byChild: "cust_id").queryEqual(toValue: "cust id 4")
    
    要完成该任务,请查询所需的子数据(在本例中为所有customer id 4节点),然后按代码订购。这里有一个例子

    class RideClass {
        var key = ""
        var cust_id = ""
        var pay_time = ""
    
        init(key: String, cust_id: String, pay_time: String) {
            self.key = key
            self.cust_id = cust_id
            self.pay_time = pay_time
        }
    }
    
    var rideArray = [RideClass]()
    
    func populateRideArray() {
        let usersRef = self.ref.child("ride_details")
        let query = usersRef.queryOrdered(byChild: "cust_id").queryEqual(toValue: "cust id 4") 
        query.observeSingleEvent(of: .value, with: { snapshot in 
            for child in snapshot.children {
                let snap = child as! DataSnapshot
                let dict = snap.value as! [String: Any]
                let key = snap.key
                let custId = dict["cust_id"] as! String
                let payTime = dict["pay_time"] as! String
                let ride = RideClass(key: key, cust_id: custId, pay_time: payTime)
                self.rideArray.append(ride)
            }
    
            for ride in self.rideArray {  //unsorted example
                print(ride.pay_time)
            }
    
            self.rideArray.sort { $0.pay_time < $1.pay_time } //sort
    
            for ride in self.rideArray {  //sorted example
                print(ride.pay_time)
            }
        })
    }
    
    然后以正确的顺序读取cust id 4节点中的一些代码

        let ridesRef = self.ref.child("ride_details")
        let query = ridesRef.queryOrdered(byChild: "id_time")
                            .queryStarting(atValue: "cust id 4_")
                            .queryEnding(atValue: "cust id 4_\\uf8ff")
        query.observeSingleEvent(of: .value, with: { snapshot in
            for child in snapshot.children {
                let snap = child as! DataSnapshot
                let dict = snap.value as! [String: Any]
                let key = snap.key
                let custId = dict["cust_id"] as! String
                let payTime = dict["pay_time"] as! String
                let ride = RideClass(key: key, cust_id: custId, pay_time: payTime)
                self.rideArray.append(ride)
            }
    
            for ride in self.rideArray {  //unsorted example
                print(ride.pay_time)
            }
        })
    
    有两点需要注意:

    必须迭代快照以维护子序列


    “\uf8ff”是Unicode中代码级别非常高的字符,因此它包含所有前面的字符。

    请将firebase结构作为文本而不是图像发布。图像是不可搜索的,如果我们需要在答案中使用它,则必须重新键入。你能澄清你的疑问吗?您期望的结果是什么?@Jay请再次检查我已编辑的问题。问题仍然不清楚;您想要的数据集是否是具有特定付款类型的特定客户的X个记录数?如果这是正确的,那么您的“回复我想要”不匹配,因为它是针对同一客户的两种不同付款类型。也许是别的原因?订单“付款时间”和“客户id”等于“价值”。不清楚。是否要按付款类型对返回的值进行排序,并且要返回的值是customer\u id=value?要添加的过滤器是动态的还是静态的?。如果是静态的,您将不得不使用JSON数据库结构,这样您就可以开始了。如果是动态的。。您可以对其中一个应用筛选器,然后在前端检索并应用另一个筛选器…听起来您试图在一个查询中组合对
    orderBy…
    的多个调用,这在Firebase数据库中是不可能的。请看,您可以用结构或查询详细解释。谢谢。你的解决方案对我有效。非常感谢你帮助我。
      "ride_details" : {
        "ride_0" : {
          "cust_id" : "cust id 4",
          "id_time" : "cust id 4_172200",
          "pay_time" : "172200"
        },
        "ride_1" : {
          "cust_id" : "cust id 2",
          "id_time" : "cust id 2_165500",
          "pay_time" : "165500"
        },
        "ride_2" : {
          "cust_id" : "cust id 1",
          "id_time" : "cust id 1_182300",
          "pay_time" : "182300"
        },
        "ride_3" : {
          "cust_id" : "cust id 3",
          "id_time" : "cust id 3_131800",
          "pay_time" : "131800"
        },
        "ride_4" : {
          "cust_id" : "cust id 4",
          "id_time" : "cust id 4_132200",
          "pay_time" : "132200"
        }
      },
    
        let ridesRef = self.ref.child("ride_details")
        let query = ridesRef.queryOrdered(byChild: "id_time")
                            .queryStarting(atValue: "cust id 4_")
                            .queryEnding(atValue: "cust id 4_\\uf8ff")
        query.observeSingleEvent(of: .value, with: { snapshot in
            for child in snapshot.children {
                let snap = child as! DataSnapshot
                let dict = snap.value as! [String: Any]
                let key = snap.key
                let custId = dict["cust_id"] as! String
                let payTime = dict["pay_time"] as! String
                let ride = RideClass(key: key, cust_id: custId, pay_time: payTime)
                self.rideArray.append(ride)
            }
    
            for ride in self.rideArray {  //unsorted example
                print(ride.pay_time)
            }
        })