无法在 Firebase 中为“用户”保留“帖子”参考

Posted

技术标签:

【中文标题】无法在 Firebase 中为“用户”保留“帖子”参考【英文标题】:Unable to persist 'posts' reference for 'users' in Firebase 【发布时间】:2016-05-04 08:44:15 【问题描述】:

我正在创建一个社交应用程序,它的一个共同方面是密切关注用户发布的帖子。我使用 Firebase 作为后端,这是我的架构

SocialApp
 posts
   -KGsBG5TPYBtzRivZnbf

   users
     facebook:10154108240254134
      cachedProfile
      displayName: "Karthik Kannan"
      imageURL: "https://scontent.xx.fbcdn.net/v/t1.0-1/p100x100..."
      posts
         -KGsBG5TPYBtzRivZnbf: true
      provider: "facebook"

当我继续从一个设备(或模拟器)添加帖子时,这按计划工作,但是当我从设备中删除应用程序并重新安装它时,用户字典中的帖子关系消失了。我希望它能够跨设备持续存在并保持关系完整,因此如果用户决定使用另一个 iDevice 登录他的帖子,则不会被孤立。 这是我为向 Firebase 添加帖子以及我目前如何跟踪用户而编写的代码。

func postToFirebase(imgUrl: String) 
    var gift: Dictionary<String, AnyObject> = [
        "giftName": giftName.text!,
        "giftDescription":giftDescription.text!,
        "giftAvailableAt": giftAvailableAt.text!,
        "giftPrice": Int(giftPrice.text!)!,
        "username": NSUserDefaults.standardUserDefaults().valueForKey("uid")!,
        "giftImage":imgUrl,
    ]

    let firebasePost = DataService.ds.REF_POSTS.childByAutoId()
    firebasePost.setValue(gift)

    firebasePost.observeSingleEventOfType(.Value, withBlock:  snapshot in
        if let postID = snapshot.key 
            DataService.ds.REF_USER_CURRENT.childByAppendingPath("posts").childByAppendingPath(postID).setValue(true)
        

    )
    

这是我设置当前用户的方式:

var REF_USER_CURRENT:Firebase 
    if let uid = NSUserDefaults.standardUserDefaults().valueForKey("uid") as? String 

        let user = Firebase(url:"\(BASE_URL)").childByAppendingPath("users").childByAppendingPath(did)
           return user!
         else 
            return Firebase()
        
    

    func createFirebaseUser(uid:String, user:Dictionary<String, AnyObject>) 

        REF_USERS.childByAppendingPath(uid).setValue(user)
    

这是我的登录控制器中的代码。

       NSUserDefaults.standardUserDefaults().setValue(authData.uid, forKey: "uid")

       let user = ["provider":authData.provider!,"displayName":authData.providerData["displayName"]!,"cachedProfile":authData.providerData["cachedUserProfile"]!, "imageURL":authData.providerData["profileImageURL"]!]

       DataService.ds.createFirebaseUser(authData.uid, user: user)

       self.performSegueWithIdentifier("loggedIn", sender: nil)

这是我写的所有代码。我怀疑这与 NSUserDefaults 有关。这个初学者将不胜感激任何帮助。

【问题讨论】:

当您向 Firebase 发帖时,您是否登录到 Firebase 仪表板并确保数据确实存在。其次,您是否将任何 onDisconnect 观察者附加到 Firebase 中的任何节点。最后,当用户注销或断开连接时,您向 Firebase 写入任何内容?而且...在登录控制器中,为什么您的 createFirebaseUser 应该用于验证现有用户。 您在哪里实际验证您的用户?另外,澄清一下,数据不会跨设备持续存在。数据存在于 Firebase 中,Firebase 会在观察 Firebase 数据的设备之间启用和同步数据。 嘿@Jay,我已经登录到仪表板并检查了数据的存在。只有用户和帖子之间的关系被“重置”了。而且我的 createFirebaseUser 不在登录控制器中,而是在我用于 Firebase 数据服务的单独文件中。 我在登录控制器中验证了我的用户。检查他是否已经登录或打开登录屏幕。 实际上只有两种方法可以从 Firebase 中删除数据 1) 如果有一个 onDisconnect 观察者附加到该节点(或父节点)和 2) 如果数据设置为 nil。我的猜测是后者,所以可能在退出应用程序或下次登录时,该节点被设置为 nil,这会将其从 Firebase 中删除。你可以测试一下;启动您的应用程序并登录。然后打开您的 Firebase 信息中心。确保有问题的数据出现在仪表板中。然后退出应用程序。如果您看到仪表板中的数据消失了,那么它很可能被设置为 nil。 【参考方案1】:

检查您的代码。我在这里发现了一个错字:

var REF_USER_CURRENT:Firebase 如果让 uid = NSUserDefaults.standardUserDefaults().valueForKey("uid") 为?字符串

    let user = Firebase(url:"\(BASE_URL)").childByAppendingPath("users").childByAppendingPath(did)
       return user!
     else 
        return Firebase()
    

而不是“...childByAppendingPath(did)” 您可能想将“did”更改为“uid”

除此之外,我还没有测试过你的其余代码。

好像您已经观看了制作此应用的标记价格课程。 我也有:)

【讨论】:

以上是关于无法在 Firebase 中为“用户”保留“帖子”参考的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 身份验证导入是不是会保留给定的 UID?

反应原生 Firebase 不保留用户信息

无法使用唯一键从 Firebase 检索用户位置数据

Firestore/Firebase - 为关注/关注用户帖子建模数据的方法

如何在 MySql 查询中为类似 Instagram 的帖子创建视图?

如何只允许特定用户在 Firebase 中创建新用户?