Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将数据嵌套到firebase中的每个UID_Ios_Swift_Firebase_Firebase Realtime Database - Fatal编程技术网

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

Ios 将数据嵌套到firebase中的每个UID,ios,swift,firebase,firebase-realtime-database,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! va

我正在尝试创建一个阅读列表应用程序,并希望在用户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”可用之前运行”

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


显然对Swift来说非常陌生,但在此方面的任何帮助都将不胜感激

由于我不知道您将其放入的上下文,因此我假设您试图在
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")
}

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

结构看起来像这样

users
  uid_0
    age: "37"
    name: "Larry"
    reading_list:
        item_0: "Discovery"
        item_1: "Astronomy"
        item_2: "Popular Mechanics"
    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)")
        }
    })
要创建此结构,有一种方法:

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)
为了读取节点,我们使用这样的观察者

users
  uid_0
    age: "37"
    name: "Larry"
    reading_list:
        item_0: "Discovery"
        item_1: "Astronomy"
        item_2: "Popular Mechanics"
    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)

嗨,贾斯汀-对不起。这在TableViewController中,位于viewDidLoad()上方。我尝试了您的建议,但它给出了一个错误“无法调用非函数类型'FIRDatabaseReference'的值”-有任何建议吗?我更新了代码。要修复此错误,请确保在
之后调用
.child
。child(self.user.uid)
确定进度!它修复了一个错误,但抛出了另一个错误:“线程1:exc\u bad\u指令”(代码=exc_i386_invop,子代码=0x0)"如果看不到更多的代码或可运行版本,我不知道会有什么错误。请将其添加到沙箱中,以便您可以查看此文件中的代码。如果您能发现引发该错误的任何内容,请让我知道您的具体要求是什么?如何编写代码以在您的用户节点中创建阅读列表节点,或者如何读取该节点节点…或者如何在表视图中显示它?你有建议的Firebase结构吗?如果你能澄清这个问题,我们可能会回答它。嗨@Jay-我在问如何更改我的代码,使阅读列表节点成为uid的子节点。在表视图中显示,我可以集中精力,但这是我真正坚持的第一步。建议的Firebase的结构是这样的:Users-uid1-reading list-uid2-reading list你想知道如何创建该节点还是在节点中读取,或者两者都读取?或者其他什么?对不起,它不允许我在5分钟后编辑评论,所以这里是应该完成的:Hi@Jay-我在问如何更改我的代码以使reading列表节点是uid的一个子节点。在tableView中显示我可以让我的头脑清醒过来,但这是我真正坚持的第一步。当前的Firebase结构是。建议的结构是。谢谢!两者都很好。但我现在只想解决如何创建该节点的问题@Jay可以工作-尽管我将存储我需要的其他一些东西n阅读列表(url、阅读时间等)所以我们需要在这方面做进一步的阐述。谢谢你,这真的很重要helpful@NigelThornberry很高兴它有帮助!请确保接受答案,这样它也可以帮助其他人。没有时间检查它在我的代码中是否有效,但将接受它作为答案-再次感谢!@NigelThornberry如果您需要任何其他帮助,请与我们联系。否则,请访问当你有时间回顾的时候,请点击它!对不起,Jay,最后一个,然后我将关闭它。这不会将它保存到特定的“uid\u 0”而不是通用的uid吗?我以前的代码“(self.user.uid)”在其他地方工作过,非常好的uid节点,它只是没有嵌套在我想要的位置