ios - 如何将数据添加到firebase数据库中的特定使用引用?

标签 ios swift firebase firebase-realtime-database

我当前的 iOS 要求用户注册并登录,一旦用户登录,数据就会通过他们的 user.uid 和他们注册时使用的电子邮件地址显示在数据库中。用户登录后,我希望用户能够将数据存储在他们特定的 user.uid 节点。例如,如果“用户 A”登录并输入某种类型的数据,我希望将数据保存在该用户的正下方(因此每个用户都应包含自己的数据集,并且不应访问或修改任何除了自己的其他用户数据)。所以我的问题是,跟踪登录用户或访问登录用户以在登录 Controller 之外的以后的 View Controller 中存储 future 引用的最佳方法是什么?这是一个送餐应用程序,所以一旦用户登录,我希望以后所有输入的数据都保存在数据库中的该用户名下。

登录 Controller 代码:

 import UIKit
 import FirebaseDatabase
 import FirebaseAuth

 class LogInController: UIViewController {

var ref: DatabaseReference!


@IBOutlet weak var emailField: UITextField!
@IBOutlet weak var passwordField: UITextField!


func placeholders() {
    emailField.placeholder = "Enter Email"
    passwordField.placeholder = "Enter Password"
}






@IBAction func loginButton(_ sender: AnyObject) {

    Auth.auth().signIn(withEmail: emailField.text!, password: passwordField.text!, completion: { (user, error) in




        let userID: String = (user?.uid)!
        let userEmail: String = self.emailField.text!

        self.ref.child("Users/\(userID)").setValue(userEmail)




        if error != nil {
            print(error?.localizedDescription as Any)
        }

        else {
            print("User logged in with UserID of: " + (user?.uid)!)
        }
        })
    performSegue(withIdentifier: "signedIn", sender: self)


}



@IBAction func signoutButton(_ sender: Any) {
    print("User has logged out...")
   try!  Auth.auth().signOut()
}



@IBAction func registerButton(_ sender: AnyObject) {

    Auth.auth().createUser(withEmail: emailField.text!, password: passwordField.text!, completion: { (user, error) in

        if error != nil {
            print(error?.localizedDescription as Any)
            return
        }

            print("User created with UserId of: " + (user?.uid)!)


    })
}



override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let flavorsVC = segue.destination as? FlavorsController {
        flavorsVC.ref = ref
        let userEmail = emailField.text
        flavorsVC.email = userEmail!

    }
}







override func viewDidLoad() {
    super.viewDidLoad()


    placeholders()
    ref = Database.database().reference()

}

所以,一旦用户登录,我希望所有输入的数据都保存在以下 View Controller 上的登录用户的正下方。例如,在下一个 View Controller 中,我有一个变量 bookieAmount,我如何将我的代码修改为每个登录用户都有一个单独的节点,可以保存他们的个人 bookieAmount到?到目前为止,当我尝试实现此类功能时,它只是替换了以前的引用,并没有像我希望的那样为该特定用户创建新的引用。

下一个 View Controller 的代码:

  class FlavorsController: UIViewController, UITableViewDelegate, UITableViewDataSource {

var bookieFlavors = ["Chocolate Chip", "Sugar w/o icing", "Sugar w/ icing", "Peanut Butter", "Honey", "Shortbread", "Ginger", "Double Chocolate", "Macadamie Nut", "Oatmeal Raisin", "Snickerdoodle"]
var amount = [Int]()
var bookieTotal = Int()
var ref: DatabaseReference!
var flavorRef: DatabaseReference!
var email = String()





override func viewDidLoad() {
    super.viewDidLoad()
    for _ in self.bookieFlavors {
        self.amount.append(0)
    }
    flavorTable.delegate = self
    flavorTable.dataSource = self

    //database references
    ref = Database.database().reference()
    flavorRef = Database.database().reference()



}

func emptyAmount(_ sender: UIButton) {
    print("Button Held, Amount Emptied")
    self.amount[sender.tag] = self.amount[sender.tag] - (self.amount[sender.tag] + 1)
    let cell = self.flavorTable.cellForRow(at: IndexPath(row: sender.tag, section: 0)) as? FlavorTableCell
    cell?.bookieAmount.text = "= \(self.amount[sender.tag])"

}


@IBAction func bookieButton(_ sender: UIButton) {

    self.amount[sender.tag] = self.amount[sender.tag] + 1
    let cell = self.flavorTable.cellForRow(at: IndexPath(row: sender.tag, section: 0)) as? FlavorTableCell
    cell?.bookieAmount.text = "= \(self.amount[sender.tag])"
   // print(amount[sender.tag])

    self.bookieTotal = amount.reduce(0, +)
    print(bookieTotal)
}




@IBOutlet weak var flavorTable: UITableView!


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

}

func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

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


    //flavor label configuration
    cell.flavorLabel.text = bookieFlavors[indexPath.row]

    //amount configuration
    cell.bookieAmount.text = "= \(self.amount[indexPath.row])"
    cell.bookieButton.tag = indexPath.row
    cell.bookieButton.addTarget(self, action: #selector(bookieButton(_:)), for: .touchUpInside)
    cell.bookieButton.addTarget(self, action: #selector(emptyAmount(_:)), for: .touchDownRepeat)

    return cell

}

@IBAction func registerBookieAmount(_ sender: Any) {
    print(bookieTotal)

    let amount: Int = bookieTotal
    let user = Auth.auth().currentUser

    if ((user) != nil) {


    }

}

最佳答案

你可以做的是向 Firebase 服务器发出请求,以查看用户是否仍然通过此代码登录

if Auth.auth().currentUser != nil {
  // User is signed in.
  let ref = Database.database().reference()
  ref.child("users").child(user.uid).child("orders").setValue(["order": orderNumber])
} else {
  // No user is signed in.

}

关于ios - 如何将数据添加到firebase数据库中的特定使用引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45890823/

相关文章:

android - 如何在用户注册和登录时使用 firebase 将 OTP 代码发送到电子邮件和电话号码

arrays - 在 swift 中调用解析函数失败

swift - Swift 4 中的字典打印键和值

ios - 如何使用透明导航栏和工具栏正确地动画推送 View Controller ?

ios - 将 UIBarButtonItem 添加到推送到 UINavigationcontroller 上的 ViewController

ios - 当我尝试在代码块外编辑文本标签时,swift animateWithDuration 中断

spring - 使用 Spring Security 和 Firebase 身份验证的 REST 服务

ios - 如何在 Firebase IOS 中正确链接不同的 Auth 帐户

objective-c - Xcode & 网页 View : Load local html if no internet connection (fallback)

ios - 添加 firebase 崩溃分析脚本后获取 Shell 脚本调用警告