2017-02-15 162 views
2

我是firebase的新手,为我创建了一个Firebase结构,我想要做的基本上是列出所有用户的FirebaseDB。在Swift中为Firebase DataStructure创建类

我想快速创建一个相应的类到下面的firebase数据结构。

"users" : { 
    "A654tdC5uBPoKQzJnpZIpwOfsaJ3" : { 
     "groups" : { 
     "-KZ7fl3I4W7YWuGk6l9k" : true, 
     "-KclzmvvJF54cAg14P92" : true, 
     "-KclzpzrJOhCOWL5_jvw" : true, 
     "-Kcm33N1B_oiVYrQWh3n" : true, 
     "-Kcm3GfRaaGfztEBmflp" : true 
     }, 
     "location" : { 
     "coordinates" : [ 6.59086, 3.3914267 ], 
     "name" : "Oyebanjo Solarin Street, Lagos", 
     "visibility" : true 
     }, 
     "photoUrl" : "http://pbs.twimg.com/profile_images/511567946351923201/YBqqKc78_normal.jpeg", 
     "username" : "Kamiye", 
     "visibilityToSelectContacts" : { 
     "contacts" : { 
      "gFTCpzgSJDOsrVKWbAJp0Z1JFXp1" : true, 
      "rRxT6x87kgSjTwZfa7M8ZwzdFkC3" : true 
     }, 
     "visibility" : true 
     } 
    }, 

这就是我试图和它不工作

class LContact { 

var visibliityToSelectedContacts: VisibilityToSelectContacts? 
var photoUrl: String? 
let username: String 
var location: LALocation? 
var groudId = [String]() 


init (value: [String: Any]) { 
    self.username = value["username"] as! String 
    self.photoUrl = value["photoUrl"] as? String 
    self.location = LALocation(value: value["coordinates"] as? [String:Any] ?? [:]) 
    self.groudId = (value["groups"] as? [String])! 
    } 
} 

class VisibilityToSelectContacts { 

var contacts = [String]() 
var visibility: Bool 

init(value: [String: Any]) { 
    self.contacts = [value["contacts"] as! String] 
    self.visibility = value["visibility"] as! Bool 
    } 
} 

struct LALocation { 

var long: Double 
var lat: Double 
var address: String! 
var visibility: Bool! 

init(long: Double, lat: Double, address: String?, visibility: Bool) { 
    self.long = long 
    self.lat = lat 
    self.address = address 
    self.visibility = visibility 
} 

init?(value: [String: Any]) { 
    guard let long = value["0"] as? Double, 
     let lat = value["1"] as? Double else {return nil} 
    self.long = long 
    self.lat = lat 
    self.address = value["name"] as? String 
    self.visibility = value["visibility"] as? Bool 
    } 
} 
+0

你能澄清你的问题?你想为你的数据库结构创建一个类模型 - 搜索注册用户?搜索数组在哪里?码?在Firebase中? *它不起作用*是什么意思?你有错误吗?提交的代码似乎过于复杂,所以也许你可以简化它 - 提供更多的细节(和更短的代码)将帮助我们帮助你。另外,* A654tdC5uBPoKQzJnpZIpwOfsaJ3 *代表什么? – Jay

+0

@Jay我已经发布了我的firebase结构的片段,我想要做的就是为上面的片段创建一个类 – SimpiMind

+0

格式化遍布各处,真的很难阅读。我改变了我的评论。 – Jay

回答

3

让我来帮你解决一些可能有用的代码。这不是整个班级,但所有的概念都在那里。我也是使用简化的火力地堡结构,但同样,这些概念是相同的:

这里的火力地堡结构

users 
    a_uid 
    email: "some email" 
    groups 
     group_1: true 
     group_2: true 
    location 
     coords: "[52.5, 67.1]" 
     name: "Oyebanjo Solarin Street, Lagos" 
     visibility: true 
    username: "some username" 

首先有似乎是为每个用户多数民众赞成在一个位置适合于作为一个结构。

struct LocationStruct { 
     var coords: String? 
     var name: String? 
     var visibility: Bool? 
    } 

然后,我们在我们的用户类中使用该结构。在这个例子中,我们传入一个单一用户的快照来初始化类并解构它以填充类变量。

class UserClass { 
    var email = "" 
    var username = "" 
    var groupsDict: [String: Any] 
    var loc = LocationStruct() 

    init(snap: FIRDataSnapshot) { 

     let userDict = snap.value as! [String: Any] 

     self.email = userDict["email"] as! String 
     self.username = userDict["username"] as! String 

     self.groupsDict = userDict["groups"] as! [String: Any] 

     let locationDict = userDict["location"] as! [String: Any] 
     self.loc.coords = locationDict["coords"] as? String 
     self.loc.name = locationDict["name"] as? String 
     self.loc.visibility = locationDict["visibility"] as? Bool 
    } 
} 

下面是一个用户读取和填充UserClass的

ref.child("users").child("a_uid") 
         .observeSingleEvent(of: .value, with: { snapshot in 

     let user = UserClass(snap: snapshot) 

     //this code is just to show the UserClass was populated. 
     print(user.email) 
     print(user.username) 

     for group in user.groupsDict { //iterate over groups 
      print(group) //and print each one 
     } 

     print(user.loc.coords!) //print the location data 
     print(user.loc.name!) 
     print(user.loc.visibility!) 
    }) 

只有在你的结构遗留的问题,那里有一个visibilityToSelectContacts节点,其中有一个子节点接触的代码。

所以基本上在UserClass的UserDict中的高层次词典将有一个孩子叫visibilityToSelectContacts然后有具有关键的子字典中的孩子接触:的“gFTCpzgSJDOsrVKWbAJp0Z1JFXp1”值对:真。像这样

userDict 
    visibilityToSelectContacts 
     contacts 
     contant_0: true 
     contant_1: true 

我会离开你得到那个结构敲定(提示:这是相同的设计模式)

+0

谢谢,它的工作! – SimpiMind

0

尝试使用3D党库拆箱像this
也检查你使用提取未来孩子如键:

LALocation(value: value["coordinates"] as? [String:Any] ?? [:]) 

在这里你需要:

LALocation(value: value["location"] as? [String:Any] ?? [:]) 

和获取数据后,不要忘记提取对象ID snapshot.key

+0

这与创建类匹配Firebase结构的问题有什么关系?为什么在数据已经可用时添加第三方库? – Jay

+0

我需要创建一个类,我不知道是否需要添加第三方。如果你能编辑我所尝试过的东西,我将不胜感激。我对Firebase仍然陌生。 – SimpiMind