【问题标题】:How to build structured realtime firebase database for ios, swift?如何为 ios、swift 构建结构化的实时 firebase 数据库?
【发布时间】:2020-08-04 18:14:11
【问题描述】:

我目前正在为我的 ios 应用程序设置我的实时 firebase 数据库。 这是我第一次尝试在 firebase 数据库中构建用户数据,我真的非常非常难以理解一些关键的东西。

我的应用程序数据库需要的一点上下文:

创建新用户时,直接分配给用户的属性有:

  • 年龄
  • 电子邮件
  • 用户名
  • 国籍

稍后,用户需要创建个人日记的选项! 这些日记中的每一个都是对象的数组/列表...其中日记中的每个对象还包含列表/数组中的一些属性。

在阅读了我可以在任何地方找到的所有内容后,我将我的数据库想象成这样:

如果它变得过于具体,我感到非常抱歉 - 我会尽量使问题尽可能开放:

我的问题是:

如何以编程方式创建不同的“孩子”以及如何找到返回它们的键,以便我可以在其他时间再次引用它们? (在子项中编辑属性时)。

我尝试过的几种方法:

  • setValue([ArrayOfObjects]) --> 这会创建所需的数组,但我似乎找不到例如此数组中的索引 3,以允许用户稍后更改他/她的电子邮件。

  • childByAutoID() --> 这也创建了我的数组,但带来了其他几个问题:用户只能存储一本日记,仍然找不到特定索引的路径...

  • setValue(), andPriority() --> 似乎无法实现优先级功能。 (这个功能是不是也过时了??)

  • 还有一些……

如果有人能告诉我如何完成设置我的数据库结构的前几个步骤,我将永远感激 - 我已经花了一整天的时间,我没有继续前进......

或者至少告诉我,关于我想要的数据库设置是否在正确的轨道上。它是否足够平坦?有没有更聪明的方法来存储所有这些用户创建的列表?

非常感谢! :-)

【问题讨论】:

    标签: ios arrays swift firebase-realtime-database children


    【解决方案1】:

    我不了解 Swift,所以我的示例在 Dart 中,但我相信方法是相似的。

    首先,我将用户节点一分为二。一个用来保存用户数据,这通常是静态的,另一个用来保存日记。您将使用相同的 uid 键作为对两者的引用。这样,您不必担心嵌套,因此更容易对数据进行 CRUD。如果您使用 Firebase 对您的用户进行身份验证,那么我将使用 Firebase 为每个用户创建的唯一密钥作为这两个节点的密钥。

    那么……

    要创建用户数据节点记录,Dart 代码将类似于:

    referenceUserData.child(<authenticated user id>).set({
      "age": <age value>,
      "email": <email value>,
      "name": <name value>,
    });
    

    要创建用户日记节点对象记录,Dart 代码将类似于:

    referenceUserData.child(<authenticated user id>).child(<diary key>).child(<diary object key>).set({
      "object info value 1": <object value>,
      "object info value 2": <object value>,
      "object info value 3": <object value>,
    });
    

    您还可以通过使用 .set() 将它们写入列表(数组)来一次创建所有对象记录。

    您还需要决定您的日记本钥匙应该是什么。您可以使用 Firebase 通过 .push().set() 生成唯一密钥。

    阅读例如。用户数据,那么您的呼叫可能是:

    referenceUserData
      .child(<authenticated user id>)
      .once()
      .then(
    (DataSnapshot snapshot) {
      print(snapshot.key);
      if (snapshot.value != null) {
        print(snapshot.value);
        <code to process your snapshot value>
      }
    };
    

    顺便说一句,“优先级”是 Firebase RTDB 早期遗留下来的,所以我不会尝试使用它。

    【讨论】:

    • 非常感谢您的回答。我一定会按照你的建议将我的用户节点一分为二!我试图弄清楚所提供的代码在 Swift 中可能等同于什么。因此,一个问题:在所有代码位中,您指的是“referenceUserData” - 这是一种 dart 方法还是您创建的有价值的方法,它指的是你的数据库?在 swift 中,您可以创建一个 databaseReference,只要您想对您的数据库做任何事情 - 但我似乎无法开始工作的是创建一个比总体数据库更“狭窄”的路径的引用。跨度>
    • 因此,在 Dart 中创建数据库实例的代码然后引用将是:FirebaseDatabase firebaseDatabase = FirebaseDatabase.instance; 然后referenceUserData = firebaseDatabase.reference().child("&lt;name of your user data node&gt;");。那么上面的代码就适用了。
    • 我用于日记 nide 的参考并不完全正确。我建议您为根定义一个引用,然后使用 .child 的快速等效项向其添加必要的节点名称,即。 referenceRoot = FirebaseDatabase.reference(); 然后referenceRoot.child("&lt;user data node&gt;");
    • 如果您对答案感到满意,请将其标记为首选答案,并给它打上绿色的勾:-) 谢谢,祝您的应用好运。
    猜你喜欢
    • 2020-01-20
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 2018-04-21
    • 1970-01-01
    相关资源
    最近更新 更多