2016-08-15 30 views
0

您好我是Swift开发新手,刚开始使用Google的Firebase数据库。 我在构建JSON树时遇到了一些问题,首先是因为我使用的.childByAutoId() func创建了一个唯一的ID,这对现在非常有用,但如果我想将其命名为“Locations”在数据库?ios - Firebase编写复杂数据

其次,我真正的问题是,我想在我的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

+0

我不能帮你,直到你告诉我,你想怎样构建你的数据即' JSON'树形结构 – Dravidian

+0

@Dravidian抱歉,我想我的解释有点含糊。我添加了一张图片来说明我想要的结构。另外如何控制我的位置对象的名称?谢谢:)希望这有助于! – thatGuyNeil

回答

2

始终避免使用Dictionary 要创建所需的JSON树火力database.Prefer使用TuplesArrays: -

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创建的,这就是为什么它具有在它... 0;)

但可以肯定,你可以阅读这些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...! 
     } 
     } 
    } 
    }) 

} 
+0

如果这解决了你的问题,接受它作为答案或只是让我知道,如果你卡住.. :) – Dravidian

+0

我想我把它整理出来。谢谢! btw我怎样才能控制位置的顺序加载到我的tableview? queryOrderedByKey()似乎混淆了我的原始列表 – thatGuyNeil

+0

将locationDict更改为位置字典。它确保它保存在DB – Dravidian