Firebase/Swift 两个数据库连接

Posted

技术标签:

【中文标题】Firebase/Swift 两个数据库连接【英文标题】:Firebase/Swift two database-connections 【发布时间】:2017-10-08 12:38:45 【问题描述】:

我有一个应用程序,我想连接到两个不同的 firebase 数据库。 我有两个 viewControllers 可以单独连接到每个数据库,但是如果我连接到第一个数据库,然后连接到另一个 - 应用程序崩溃

我有 2 个 info.plist 文件和 2 个通过按钮/segue 连接的 ViewController。

这是我的第一个视图控制器

import UIKit
import Firebase
class ViewController: UIViewController 
var ref: DatabaseReference!
   var handle:UInt!


override func viewDidLoad() 
    super.viewDidLoad()
    let filePath = Bundle.main.path(forResource: "GoogleService-Info-anden", ofType: "plist")
    guard let fileopts = FirebaseOptions.init(contentsOfFile: filePath!)
        else  assert(false, "Couldn't load config file") 
    FirebaseApp.configure(options: fileopts)
    ref = Database.database().reference()
    ref?.child("UserVandreture").child("navn").setValue("Inger")


override func viewDidDisappear(_ animated: Bool) 
    ref.removeObserver(withHandle: handle)

我可以连接到 firebase - 当我加载应用程序时会发生这种情况。

第二个视图控制器

import UIKit
import Firebase

class AndenDBViewController: UIViewController 
var ref: DatabaseReference!
var handle:UInt!
let fileName = "Bambusstien"
override func viewDidLoad() 
    super.viewDidLoad()
    let filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist")
    guard let fileopts = FirebaseOptions.init(contentsOfFile: filePath!)
        else  assert(false, "Couldn't load config file") 
    FirebaseApp.configure(options: fileopts)
    ref = Database.database().reference()
    response()


override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.

//kan læse navn,type, længde og link
func response() 
    ref?.child("Vandreture").child(fileName).observe(.value, with:  (snapshot) in
        let dict = snapshot.value as? [String: AnyObject]
        let navn = dict!["navn"] as? String
        print(navn as Any)

        let type = dict!["type"] as? String
        print(type as Any)

        let Længde = dict!["length"] as? String
        print(Længde as Any)

        let link = dict!["link"] as? String
        print(link as Any)
    )
   
override func viewDidDisappear(_ animated: Bool) 
    ref.removeObserver(withHandle: handle)
    



如果我在前一个 viewController 中对数据库调用进行注释,该控制器也能够连接到 firebase/database 并读取数据,但如果我不注释此数据,它将在第一个数据库中设置值,当我按下按钮转到第二个 viewController 时,应用程序崩溃了。

我已将 2 个 plist 文件的 targetMemebeship 设置为相同的应用程序名称。

错误消息说应用程序已经配置 - 但是我认为 ViewDidDissapear() 中的 ref.removeObserver(handle) 会在连接到另一个数据库之前断开与数据库的连接 - 那么有什么问题吗?

【问题讨论】:

ups:我忘记将句柄设置为一个值,所以... var handle:UInt = 0 但是应用程序崩溃并显示相同的消息 【参考方案1】:

基本上我需要保护我的数据,但我还没有填充数据库所以.. 我的问题的解决方案是使用规则部分——只有一个数据库。 允许用户对数据库的某些部分具有写访问权限,而对其他部分只有读访问权限 - 例如:


"rules": 
"myPersonal":
".read": true,
".write": "auth != null"

,
"myPublic": 
".read":  "auth != null",
".write": true


【讨论】:

以上是关于Firebase/Swift 两个数据库连接的主要内容,如果未能解决你的问题,请参考以下文章

Firebase/Swift - 从 Firebase 输出数据出错

Firebase,Swift:无法检索数据

查询和 Firebase 中的位置(swift 3)

从 Firebase Auto Id 中检索数据 - Firebase Swift

如何从 Firebase (Swift) 中删除一个孩子

试图从 firebase Swift 获取数据