将数据嵌套到firebase中的每个UID

时间:2017-07-16 06:50:14

标签: ios swift firebase firebase-realtime-database

我正在尝试创建一个阅读列表应用程序,并希望在用户uid下嵌套阅读列表,因此我可以在登录时向他们显示列表。我工作的代码是:

var items: [ReadingItem] = []
let usersRef = FIRDatabase.database().reference(withPath: "users")
let ref = FIRDatabase.database().reference(withPath: "reading-list")
var user: User!
var userCountBarButtonItem: UIBarButtonItem!

然而,这给了我数据,用户和阅读列表的节点。我尝试将代码更改为以下部分,但它给出了一个错误:“无法在属性初始化程序中使用实例成员;属性初始化程序在'self'可用之前运行”

var items: [ReadingItem] = []
let usersRef = FIRDatabase.database().reference(withPath: "users")
let ref = usersRef.child(self.user.uid)(withPath: "reading-list")
var user: User!
var userCountBarButtonItem: UIBarButtonItem!

所以最后我尝试将其更改为此,但它给出了一个错误:“无法在属性初始化程序中使用实例成员;属性初始化程序在'self'可用之前运行”

var items: [ReadingItem] = []
let usersRef = FIRDatabase.database().reference(withPath: "users")
let ref = self.usersRef.child(self.user.uid)(withPath: "reading-list")
var user: User!
var userCountBarButtonItem: UIBarButtonItem!

对Swift来说显然是非常新的,但是对此的任何帮助都会非常感激!

2 个答案:

答案 0 :(得分:0)

由于我不知道您正在使用的上下文,我假设您尝试在UIViewController中调用它。如果您在UIViewController中执行此操作,则可能需要尝试执行以下操作。

声明你的变量:

var items: [ReadingItem] = []
var usersRef: DatabaseReference?
var ref: DatabaseReference?
var user: User!
var userCountBarButtonItem: UIBarButtonItem!

然后在viewDidLoad()中,执行此操作:

override func viewDidLoad() {
    self.usersRef = Database.database().reference(withPath: "users")
    self.ref = self.usersRef?.child(self.user.uid).child(withPath: "reading-list")
}

答案 1 :(得分:0)

假设您希望能够在用户节点中创建用户,并且每个用户都将拥有一个包含该用户阅读列表的子节点。

结构看起来像这样

let readingListDict = [
    "item_0": "Discovery",
    "item_1": "Astronomy",
    "item_2": "Popular Mechanics"
]

let userDict = [
    "name": "Larry",
    "reading_list": readingListDict,
    "age": "37"
] as [String : Any]


let usersNode = self.ref.child("users")
let thisUser = usersNode.child("uid_0")
thisUser.setValue(userDict)

要创建此结构,这是执行此操作的一种方法:

    let thisUserRef = self.ref.child("users").child("uid_0")

    thisUserRef.observeSingleEvent(of: .value, with: { (snapshot) in
        if let userDict = snapshot.value as? [String: Any] {
            let name = userDict["name"] as! String
            let age = userDict["age"] as! String
            let readingList = userDict["reading_list"] as! [String: Any]
            print("name: \(name)  age: \(age)")
            print("  list: \(readingList)")
        }
    })

这个读取节点,我们使用像这样的观察者

name: Larry  age: 37
  list: ["item_1": Astronomy, "item_0": Discovery, "item_2": Popular Mechanics]

,输出

let thisUserReadingListNode = self.ref.child("users").child("uid_0").child("reading_list")
thisUserReadingListNode.setValue(readingListDict)

上面的代码只是一种方式,非常详细,并且有很多错误检查。

要进一步扩展,如果你知道用户uid和那个用户节点已经存在,你可以直接写入阅读列表子节点

>>> df['54513_answer'] = df['string_col'].apply(lambda x: x[-1] if len(x)>6 and x[-7:-1]=='541513' else 'Null')
>>> df
                                          string_col 54513_answer
0                            541511N~541512N~541513N            N
1                                    332710Y~332999Y         Null
2                                               Null         Null
3  238210Y~423690Y~517911Y~517919Y~532490Y~561421...         Null