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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.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)_Ios_Swift_Firebase_Firebase Realtime Database - Fatal编程技术网

Ios 如何从另一个子项查询子项。消防基地(SWIFT)

Ios 如何从另一个子项查询子项。消防基地(SWIFT),ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我正在开发一个送货应用程序。因此,我在firebase中使用productos和流行产品的方式如下: 产品 PopularProducts(产品ID作为键,true作为值) 如何仅查询使用这些child的受欢迎产品?您可以查询按esPopular子项订购的产品,并仅返回其等于true的子项 let ref = Database.database().reference(withPath: "productos") let query = ref.queryOrdered(byChil

我正在开发一个送货应用程序。因此,我在firebase中使用productos和流行产品的方式如下:

  • 产品

  • PopularProducts(产品ID作为键,true作为值)


如何仅查询使用这些child的受欢迎产品?

您可以查询按
esPopular
子项订购的产品,并仅返回其等于
true
的子项

let ref = Database.database().reference(withPath: "productos")
let query = ref.queryOrdered(byChild: "esPopular").queryEqual(toValue: true)

query.observe(.childAdded, with: { (snapshot) in
    print(snapshot)
}) { (error) in
    print(error)
}

您可以查询按
esPopular
子项排序的子项,并仅返回其等于
true
的子项

let ref = Database.database().reference(withPath: "productos")
let query = ref.queryOrdered(byChild: "esPopular").queryEqual(toValue: true)

query.observe(.childAdded, with: { (snapshot) in
    print(snapshot)
}) { (error) in
    print(error)
}

您需要获取
productosPopulares
的数组,然后获取每个对象

let referenceToProductosPopulares = FIRDatabase.database().reference(withPath: "productosPopulares")

referenceToProductosPopulares.observeSingleEvent(of: .value, with: { snapshot in
        if let value = snapshot.value as? NSDictionary {
           let productosPopIds = value.allKeys as! [String]
           // get every object    
           for id in productosPopIds {
               let refToProd = FIRDatabase.database().reference(withPath: "productos").child(id)
               refToProd.observeSingleEvent(of: .value, with: { snapshot in
                   // your value
               })
           }
        } else {
          print("productosPopulares")
        }
     })
不是完美的代码。应该做更多的功能。但这是一个好主意


希望对您有所帮助

您需要获取
productosPopulares的数组
,然后获取每个对象

let referenceToProductosPopulares = FIRDatabase.database().reference(withPath: "productosPopulares")

referenceToProductosPopulares.observeSingleEvent(of: .value, with: { snapshot in
        if let value = snapshot.value as? NSDictionary {
           let productosPopIds = value.allKeys as! [String]
           // get every object    
           for id in productosPopIds {
               let refToProd = FIRDatabase.database().reference(withPath: "productos").child(id)
               refToProd.observeSingleEvent(of: .value, with: { snapshot in
                   // your value
               })
           }
        } else {
          print("productosPopulares")
        }
     })
不是完美的代码。应该做更多的功能。但这是一个好主意



希望对您有所帮助

在这种情况下,您将下载每个对象,然后进行搜索,我记得。这不是一个好主意way@VladPulichev在这种情况下,客户端并不是下载每个对象。查询不会在客户端上进行,因此客户端只下载
esPopular
等于true的子项。好吧,没关系,它会在服务器上执行,但是的,我写错了。您不会下载所有数据。但服务器将在服务器端执行相同的操作。。例如,对于100000个对象,服务器将检查每个项目。这是没有效率的。请检查firebase文档。最佳做法是使用“true”值存储id数组。@VladPulichev这就是规则中的
。indexOn
的目的,您可以使用它来提高查询性能。在这种情况下,您将下载每个对象,然后搜索,我记得。这不是一个好主意way@VladPulichev在这种情况下,客户端并不是下载每个对象。查询不会在客户端上进行,因此客户端只下载
esPopular
等于true的子项。好吧,没关系,它会在服务器上执行,但是的,我写错了。您不会下载所有数据。但服务器将在服务器端执行相同的操作。。例如,对于100000个对象,服务器将检查每个项目。这是没有效率的。请检查firebase文档。存储具有“true”值的id数组是最佳做法。@VladPulichev这就是规则中的
.indexOn
的目的,您可以使用它来提高查询性能。这个答案没有我的答案有效。您首先下载流行产品的密钥,然后对每个产品单独提出请求,这是不好的。@Callam在您的案例中有10000个对象,服务器端将检查每个对象。效率不高。在我的例子中,它将只下载必要对象的完整数据。他有一系列的身份证。他只需要下载带有这个id的物品。@Callam我认为最好的方式取决于Gustavo的完整逻辑。将来他可以用最好的方法来解决问题。无论如何问题是“如何从另一个孩子那里查询一个孩子”。这是我的答案。你根本不用这个数组。对于这个问题,我的答案更好。可能是(可能是,我们无法证明)更好的解决所有情况的方法是你的:)@Callam,谢谢你。Cz我不知道firebase有索引:)这个答案没有我的有效。您首先下载流行产品的密钥,然后对每个产品单独提出请求,这是不好的。@Callam在您的案例中有10000个对象,服务器端将检查每个对象。效率不高。在我的例子中,它将只下载必要对象的完整数据。他有一系列的身份证。他只需要下载带有这个id的物品。@Callam我认为最好的方式取决于Gustavo的完整逻辑。将来他可以用最好的方法来解决问题。无论如何问题是“如何从另一个孩子那里查询一个孩子”。这是我的答案。你根本不用这个数组。对于这个问题,我的答案更好。可能是(可能是,我们无法证明)更好的解决所有情况的方法是你的:)@Callam,谢谢你。Cz我不知道firebase有索引:)