【问题标题】:How to query firebase data childByAutoID?如何查询firebase数据childByAutoID?
【发布时间】:2019-06-04 01:17:59
【问题描述】:

是否可以一次性查询此路径并按locality 值(例如伦敦)对项目进行排序,但只获取在某个@987654322 开始/结束的项目@?

原因 - 当我在 tableView 中向下滚动时,我想从数据库中获取更多按某个区域订购的旧项目,例如伦敦和比 oldestKey 更早的项目,这是媒体的关键物品。

最初使用.childAdded方法下载第一批项目。

数据:

 media
   -LgSsaqYzevONPTk2447 // <- childByAutoID
       caption: "12"
       locality: "City of London"
       mediaUID: "-LgSsaqYzevONPTk2447"

  -LgSsZnpSNLJwZBNgXGJ
       caption: "15"
       locality: "New York"
       mediaUID: "-LgSsZnpSNLJwZBNgXGJ"

代码

   class func observeNewMediaSingleTime(_ oldestKey: String,_ 
  userLocality: String, _ completion: @escaping ([Media], String?) -> Void) {


   let ref = Database.database().reference()
     let query = ref.child("media").queryOrdered(byChild: userLocality).queryStarting(atValue: oldestKey).queryLimited(toLast: 50)


 ref.observeSingleEvent(of: .value, with: { snapshot in

    guard snapshot.exists() else {
        completion([],nil)
        return}

     let firstItem = snapshot.children.allObjects.first as! DataSnapshot

      var arrayOfMedia = [Media]()

     var count = 0
     let enumerator = snapshot.children
     while let mediaItem = enumerator.nextObject() as? DataSnapshot {
        let media = Media(dictionary: mediaItem.value as! [String:Any])

        print("media.locality is \(media.locality)")
        //check if new media has same key as oldest post downloaded in previously
        if media.mediaUID != oldestKey{
            count += 1
            arrayOfMedia.append(media)
        }
    }//end of while
    arrayOfMedia.reverse()

    if count == arrayOfMedia.count {
        let updatedOldestKey = firstItem.key
        completion(arrayOfMedia, updatedOldestKey)
    }

})
}

【问题讨论】:

    标签: swift firebase firebase-realtime-database


    【解决方案1】:

    如果您知道第一项的locality 值,则可以使用queryStarting(atValue:childKey:)

    let query = ref.child("media")
      .queryOrdered(byChild: "locality")
      .queryStarting(atValue: "City of London", childKey: "-LgSsaqYzevONPTk2447")
      .queryLimited(toLast: 50)
    

    因此,上面按位置对所有子节点进行排序,然后在locality="City of London" 和键-LgSsaqYzevONPTk2447 处开始返回结果。

    【讨论】:

    • 这显然没有做它应该做的事情。即使在locality == "City of London" 的数据库中保存了20 个项目,它也会下载其他区域的项目。只是为了这个例子,我一个接一个地保存了 20 个具有相同位置值的项目,它从其他城镇提取数据....我不知道该怎么办。 imgur.com/LEXwg8l
    • .queryStarting(atValue: "City of London" 开始"City of London" 为基础,但继续返回具有其他 locality 值的子代。如果你不想这样,你也需要queryEnding(atValue: ...
    • 我刚刚在测试时发现了这一点。耐心是一种只有少数人能掌握的美德,而我今天已经用完了;我的错。非常感谢。非常感谢您的帮助。
    • 一个问题。它从数据库中提取了大约 30 个项目,但现在它不再提取任何数据,即使有很多数据。我使用了...queryOrdered(byChild: "locality").queryEnding(atValue: userLocality, childKey: oldestKey),其中locality == "City of London" 和childKey 始终是之前下载的第一个项目的键。我注意到它下载了一些带有locality == Buckinghamshire 的项目,但现在它并没有拉更多,即使它们具有相同的地区名称。它拉 1,但不是 2。imgur.com/a/1rx7pkG。最后这些物品是 6 个月大的。
    • 如果您对locality 上的子节点进行排序,则"Buckinghamshire"之前 "City of London"。所以如果你从“伦敦市”开始,你不会得到白金汉郡的子节点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 2017-05-29
    • 1970-01-01
    相关资源
    最近更新 更多