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

标签 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 来说非常陌生,但如果能提供任何帮助,我将不胜感激!

最佳答案

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

结构看起来像这样

users
  uid_0
    age: "37"
    name: "Larry"
    reading_list:
        item_0: "Discovery"
        item_1: "Astronomy"
        item_2: "Popular Mechanics"

要创建此结构,有一种方法:

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]

上面的代码只是一种方法,非常冗长并且有很多错误检查。

进一步扩展,如果您知道用户 uid 并且该用户节点已经存在,则可以直接写入阅读列表子节点

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

关于ios - 将数据嵌套到 firebase 中的每个 UID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45125884/

相关文章:

ios - ITMS-90086 "Missing 64-bit support"将 Adob​​e Air 应用程序上传到 iTunes Connect 时出错

ios - 多次调用tableView.reloadData会不会导致性能问题?

ios - URLSession dataTask返回无错误无数据,导致SwiftyStoreKit.ReceiptError错误1

javascript - JS NG2 Firebase - 将 foreach 值添加到数组并在模板中使用

swift - 从 iPhone 访问 UIImage 时出错,但从 Xcode 模拟器访问时出错

javascript - 为范围 ('https://.xxx.net/firebase-cloud-messaging-push-scope' 注册 ServiceWorker 失败)

objective-c - Objective-C 中的属性声明

ios - 如何正确使用NSCache?

JavaScriptCore 不会将字符串作为 NSObject *

ios - 当应用程序在后台收到通知时如何获取通知负载数据