【问题标题】:Firebase Firestore use two different instances in the same appFirebase Firestore 在同一个应用中使用两个不同的实例
【发布时间】:2020-05-26 22:23:51
【问题描述】:

我目前正在 iOS 应用程序中使用 Firebase Firestore。有一个法律用例,用户必须先接受同意,然后我才能将他们的数据上传到 Firebase,但我需要让用户已经可以保存数据,即使他们尚未同意同意。

我的问题是,是否可以在一个 iOS 应用程序中拥有两个不同的 Firestore 数据库实例。一个仅离线存储数据且不同步的实例和一个正在同步的实例。然后我可以在运行时决定在哪里存储数据。

有这方面的文档或经验吗?

【问题讨论】:

    标签: ios swift firebase google-cloud-firestore


    【解决方案1】:

    我们的应用也遇到过类似的情况 - 出现了一个法律用例,要求用户选择在云中存储数据。为此,我们需要一种存储解决方案,允许仅在本地存储一些数据,并在用户选择加入时将一些数据同步到云端。我们考虑关闭离线数据的 Firestore 网络活动:Firestore.firestore().disableNetwork(completion:)

    但是,我们联系了 Google,他们的 PM 建议

    Firestore 不是一个出色的仅离线数据库。它专为最终将同步到服务器的数据而设计。离线功能旨在掩盖暂时的连接丢失。随着挂起的写入操作(也称为离线写入)数量的增加,性能会下降,并且与正常的设备上移动数据库相比,大型离线数据集的查询性能非常差。

    虽然他们可能能够使用两个数据库的解决方法,但我通常建议他们为仅离线数据选择一个完全不同的数据存储。 SQLite 是标准选项,但还有许多其他选项。

    【讨论】:

      【解决方案2】:

      绝对可以在单个应用程序中访问多个 Firestore 数据库(或其他 Firebase 资源)。但只能从GoogleService-Info.plist 初始化其中一个。根据辅助GoogleService-Info.plist 中的信息,您必须在代码中初始化其他的。

      对此的基本方法是首先使用第二个项目的配置数据创建一个FirebaseOptions对象:

      // Configure with manual options.
      let secondaryOptions = FirebaseOptions(googleAppID: "1:27992087142:ios:2a4732a34787067a", gcmSenderID: "27992087142")
      secondaryOptions.bundleID = "com.google.firebase.devrel.FiroptionConfiguration"
      secondaryOptions.apiKey = "AIzaSyBicqfAZPvMgC7NZkjayUEsrepxuXzZDsk"
      secondaryOptions.clientID = "27992087142-ola6qe637ulk8780vl8mo5vogegkm23n.apps.googleusercontent.com"
      secondaryOptions.databaseURL = "https://myproject.firebaseio.com"
      secondaryOptions.storageBucket = "myproject.appspot.com"
      

      然后使用它来初始化第二个 App 对象以获取您需要的 Firebase 服务:

      // Configure an alternative FIRApp.
      FirebaseApp.configure(name: "secondary", options: secondaryOptions)
      
      // Retrieve a previous created named app.
      guard let secondary = FirebaseApp.app(name: "secondary")
        else { assert(false, "Could not retrieve secondary app") }
      
      let secondaryDb = Firestore.firestore(app: secondary)
      

      另见:

      【讨论】:

      • 感谢您的回答。但是是否有可能拥有两个具有相同配置的 firebase 应用程序实例?因为我需要的基本上是复制的主要 Firebase Firestore 实例只是在本地不同步
      • 以上方法值得一试。
      • 看来一般情况下它会起作用,但是当我为第二个实例禁用网络时,写入事务似乎也在排队。因此,我的写事务没有得到任何回调。如果写事务不会排队,它会起作用
      • 事务需要连接到服务器,否则它们无法检查有冲突的写入并且将毫无意义。您是否考虑过在用户同意之前使用常规的本地数据库来存储数据?
      • 是的,这样交易就无法进行是完全有道理的。使用本地数据库是我现在正在实施的方法。更多的工作,但似乎是正确的解决方案。不知道你的答案是什么。基本上,我们的转换导致我的方法不适用于两个 firebase 实例,但它基本上回答了我的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-19
      • 2021-11-03
      • 2017-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多