【问题标题】:Firebase Auth & Realtime Database in Xcode: How do I only show data relevant to ONE user not all?Xcode 中的 Firebase 身份验证和实时数据库:如何仅显示与一个用户相关的数据而不是全部?
【发布时间】:2019-07-16 13:09:27
【问题描述】:

在使用 Firebase 身份验证和实时数据库的 xcode 中,我正在尝试创建一个基于信息的应用程序,用户登录并查看已经放入实时数据库而不是整个数据库的信息。

如何将 Auth 与数据库链接? 这是我当前数据库的样子:

enter image description here

我有两个viewController,一个用于登录,一个用于登录:

这是我的登录页面代码:

import UIKit
import Firebase

class LoggedInViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {


    @IBOutlet weak var loginlbl: UILabel!

    @IBOutlet weak var tbl: UITableView!

    var ref: DatabaseReference!
    var jobList = [JobModel]()

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        let job = jobList[indexPath.row]

        let alertController = UIAlertController(title:job.shipper, message:"Update", preferredStyle:.alert)


        let deleteAction = UIAlertAction(title: "Delete", style:.default){(_) in
               //self.deleteAction(job: job!)
        }
        let updatedAction = UIAlertAction(title: "Update", style:.default){(_) in

            let id = job.id

            let collected = alertController.textFields?[0].text
            let delievered = alertController.textFields?[1].text

           // ref.child("job").setValue("collected")
            //self.update(collected: collected!, delievered: delievered!)

        }

        alertController.addTextField{(textField) in
            textField.text = job.delievered

        }
        alertController.addTextField{(textField) in
            textField.text = job.collected

        }

        alertController.addAction(updatedAction)

        alertController.addAction(deleteAction)

        present(alertController, animated: true, completion: nil)
    }


    func updatedJob(id: String, collected: String, delievered: String){
        let job = [
            "id": id,
            "collected": collected,
            "delivered": delievered]

        ref.child(id).setValue(job)

    }


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! ViewControllerTableViewCell

        let job: JobModel

        job = jobList[indexPath.row]

        cell.lblCol.text = job.collection
        cell.lblDel.text = job.delivery
        cell.lblShip.text = job.shipper
        cell.lblCon.text = job.consignee
        cell.lblEmai.text = job.email
        cell.lblRef.text = job.reference
        cell.lblFreight.text = job.freight
        cell.collected.text = job.collected
        cell.delivered.text = job.delievered

        return cell  }


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return jobList.count
}

override func viewDidLoad() {

        super.viewDidLoad()

if FirebaseApp.app() == nil {
FirebaseApp.configure()     }


ref = Database.database().reference().child("jobs");

ref.observe(DataEventType.value) { (snapshot) in

if snapshot.childrenCount>0 {

self.jobList.removeAll()

for jobs in snapshot.children.allObjects as! [DataSnapshot]{
    let jobObject = jobs.value as? [String: AnyObject]
    let jobId = jobObject?["id"]
    let jobShipper = jobObject?["shipper"]
    let jobConsignee = jobObject?["consignee"]
    let jobEmail = jobObject?["email"]
    let jobReference = jobObject?["reference"]
    let jobFreight = jobObject?["freight"]
    let jobCollection = jobObject?["collection date"]
    let jobDelivery = jobObject?["delivery date"]
    let jobPod = jobObject?["pod"]
    let jobCollected = jobObject?["collected"]
    let jobDelivered = jobObject?["delivered"]

  let job = JobModel(id: jobId as! String?,
            shipper: jobShipper as! String?,
            consignee: jobConsignee as! String?,
            email: jobEmail as! String?,
            reference: jobReference as! String?,
            freight: jobFreight as! String?,
            collection: jobCollection as! String?,
            delivery: jobDelivery as! String?,
            pod: jobPod as! String?,
            collected: jobCollected as! String?,
            delivered: jobDelivered as! String?)

            self.jobList.append(job)
}
            self.tbl.reloadData()

这是我的登录页面代码:

import UIKit
import Firebase
import FirebaseAuth

class LoginViewController: UIViewController {

    static var isAlreadyLaunchedOnce = false

    @IBOutlet weak var txtemail: UITextField!

    @IBOutlet weak var txtpass: UITextField!


    var isSignin:Bool = true

    override func viewDidLoad() {
        super.viewDidLoad()

       if FirebaseApp.app() == nil {
        FirebaseApp.configure()
       }
    }


    @IBAction func submit(_ sender: UIButton) {

        if let email = txtemail.text, let passowrd = txtpass.text

        { Auth.auth().signIn(withEmail: email, password: passowrd) { (user, error) in
                if user != nil {
                    self.performSegue(withIdentifier: "goto", sender : self)
                }
                else {
                    let alert = UIAlertController(title: "Username or Password Incorrect", message: nil, preferredStyle: .alert)
                    let okButton = UIAlertAction(title: "Ok", style: .default, handler: nil)
                    alert.addAction(okButton)
                    self.present(alert, animated: true, completion: nil)
                }
            }
        }
}
}

所以我的问题是如何使用 firebase 登录到我的数据库,但只看到每个登录的相关信息而不是整个数据库,因为目前我在 tableView 中看到整个数据库。

【问题讨论】:

  • 对数据的访问由您在Firebase Database 上定义的规则控制。检查docs,他们有一个用户访问示例规则示例。
  • 是的,我已经阅读了文档并观看了其中的视频,但仍然不确定如何在我的代码中使用它。有什么想法吗?
  • 我认为这不是代码问题,如果您的rules 配置正确,Firebase 应该会自动处理它。他们有控制台,您可以在其中设置规则并根据经过身份验证或未经身份验证的用户测试访问。我将从那里开始,并确保您首先在控制台中获得正确的结果。
  • 好吧,目前我的 Firebase 规则设置为 { "rules": { ".write": "auth != null", ".read" : "auth != null", } }跨度>
  • 这意味着如果您有一个用户登录,那么您就可以在数据库的任何节点上读取和写入数据。

标签: ios swift xcode firebase-realtime-database firebase-authentication


【解决方案1】:

正如 Dennin W 所说,您可能需要更改数据组织,在我看来,这并不复杂,您可以将 Auth UID 保存为作业对象的 id。

之后,您只需要查询您的数据库,如下所示:

let query = ref.queryEqual(toValue: Auth.auth().currentUser!.uid, childKey: "id")

这一行 Auth.auth().currentUser?.uid 检索登录用户的 uid,如果您更改了在数据库中保存 jobs 的方式此查询将检索与该 ID 匹配的子代。

【讨论】:

  • 好的,很抱歉听起来有点愚蠢,但在我的代码中,我应该在我的 Viewcontroller 上的哪个位置引用它以用于我的登录页面或我的 viewcontroller 或我的登录页面?
  • 不断收到此错误:无法在属性初始化程序中使用实例成员 'ref';属性初始化程序在“self”可用之前运行
  • 你的代码在一些我可以检查的 repo 上吗?
猜你喜欢
  • 2018-07-15
  • 1970-01-01
  • 2017-12-26
  • 2019-07-10
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
相关资源
最近更新 更多