【发布时间】:2019-07-16 13:09:27
【问题描述】:
在使用 Firebase 身份验证和实时数据库的 xcode 中,我正在尝试创建一个基于信息的应用程序,用户登录并查看已经放入实时数据库而不是整个数据库的信息。
如何将 Auth 与数据库链接? 这是我当前数据库的样子:
我有两个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