【问题标题】:ios - Firebase writing complex dataios - Firebase 写入复杂数据
【发布时间】:2016-08-15 18:32:33
【问题描述】:

您好,我是 Swift 开发新手,刚开始使用 Google 的 firebase 数据库。 我在以我想要的方式构建 JSON 树时遇到了一些麻烦,首先是因为我正在使用创建唯一 ID 的 .childByAutoId() 函数,这现在很好用,但是如果我想将它命名为“位置" 在数据库中?

其次,我真正的问题是我想在我的每个 Locations 中都有一个嵌套的 Links 数组,由 2 个字符串组成。所以我尝试过使用元组,但Firebase 不喜欢那样。可能是一个愚蠢的解决方案。无论如何,我查看了 firebase 文档,并在尝试使用它时遇到了一堆编译错误......

在我的每个“位置”中构建嵌套的“链接”数组的正确语法是什么,或者基本上是在 Firebase 中创建复杂 JSON 的有效方法。 这是我的实验代码:

class func pushToFirebase(){

    let latitude = "33.333333"
    let longitude = "33.333333"
    let title = "foobar"
    let link = ("linkTitle","linkUrl")
    let link1 = "link"
    let links = [link, link1]

    let post:[String : AnyObject] = [
        "latitude":latitude,
        "longitude":longitude,
        "title":title,
        "links":links
    ]

    let firebaseRef = FIRDatabase.database().reference()
    firebaseRef.child("Locations").childByAutoId().setValue(post)   
}

desired structure

【问题讨论】:

  • 在你告诉我你想如何组织你的数据,即JSON树结构之前,我无法帮助你
  • @Dravidian 抱歉,我想我的解释有点模棱两可。我添加了一张图片来说明我想要的结构。另外如何控制我的 Location 对象的名称?谢谢:) 希望这会有所帮助!

标签: ios swift xcode firebase firebase-realtime-database


【解决方案1】:

始终避免在 firebase 数据库中使用 TuplesArrays。首选使用 Dictionary 创建所需的 JSON 树:-

class func pushToFirebase(){

let latitude = "33.333333"
let longitude = "33.333333"
let title = "foobar"
let link = ("linkTitle","linkUrl")
let link1 = "link"
let links = [link, link1]

let post:[String : AnyObject] = [
    "latitude":latitude,
    "longitude":longitude,
    "title":title,
    "links":links
]
   //To create Locations 
let firebaseRef = FIRDatabase.database().reference()
firebaseRef.child("Locations").childByAutoId().setValue(post)  




  //To create create Links

func createLinks(linkTitle : String!,linkURL : String!){
      let selfUniqueGeneratedId = String(Int(NSDate.timeIntervalSinceReferenceDate() * 1000))
                 //Will give you a unique id every second it is called (or maybe millisecond too)

      firebaseRef.child("Locations").child("Links").child(selfUniqueGeneratedId).setValue([link_title : linkTitle,
      link_url : linkURL ])

   }   
}

您无法控制 Locations 对象,因为它们是使用 childByAutoId 创建的,这就是它包含 ..Auto.. 的原因... ;)

但你肯定可以用这段代码阅读那些AutoId....

func retrieveFirebaseDB(){

 firebaseRef.child("Locations").observeEventType(.Value, withBlock: {(Snapshot) in

  if Snapshot.exists(){
          if let locationDict = Snapshot!.value as! [String:AnyObject] {
            for each in locationDict as [String:AnyObject]{
                  let locationID = each.0
               //Here you are retrieving every locationID in your node Locations, GO CRAZY...!
         }
       }
     }
  })

 }

【讨论】:

  • 如果这解决了您的问题,请接受它作为答案,或者让我知道,如果您遇到问题..:)
  • 我想我已经解决了。谢谢!顺便说一句,我如何控制将位置加载到我的 tableview 中的顺序? queryOrderedByKey() 似乎弄乱了我原来的列表
  • locationDict as [String:AnyObject]改成locationDict.children,保证了它在DB中的保存顺序
  • 我会试一试。再次感谢:)
  • @Dravidian 在将字典值上传到 Firebase 数据库时,使用格式 [String: AnyObject] 。你必须在这里使用 AnyObject 吗?我有自己想要使用的结构,但不确定 Firebase 是否能够识别它。
猜你喜欢
  • 2020-08-15
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 2022-01-18
  • 2017-10-28
  • 2019-01-08
  • 2019-05-13
相关资源
最近更新 更多