如何从Firebase实时数据库读取数据

时间:2019-12-15 15:11:43

标签: swift firebase firebase-realtime-database

如何从Firebase数据库读取数据? 我有带有以下json文件的实时Firebase数据库

{
  "Category" : {
    "Breakfast" : {
      "CategoryImg" : "Breakfast-img",
      "CategoryName" : "Breakfast"
    },
    "Gluten-Free" : {
      "CategoryImg" : "Gluten-free-img",
      "CategoryName" : "Gluten-free"
    },
    "Lunch" : {
      "CategoryImg" : "Lunch-img",
      "CategoryName" : "Lunch"
    },
    "Popular" : {
      "CategoryImg" : "Popular-img",
      "CategoryName" : "Popular"
    },
    "Trending" : {
      "CategoryImg" : "Trending-img",
      "CategoryName" : "Trending"
    },
    "Vegetarian" : {
      "CategoryImg" : "Vegetarian-img",
      "CategoryName" : "Vegetarian"
    }
  }
}

我正在使用此代码来检索详细信息

// 1
let rootRef = Database.database().reference()

// 2
let childRef = Database.database().reference(withPath: "Category")

// 3
let itemsRef = rootRef.child("Category")

// 4
let breakfastRef = itemsRef.child("Breakfast")

// 5
print(rootRef.key)
print(childRef.key)
print(itemsRef.key)
print(breakfastRef.key)

但是我在控制台中得到以下内容。有人可以帮忙吗?

nil
Optional("Category")
Optional("Category")
Optional("Breakfast")

我正在关注本教程,但无法获得相同的结果 https://www.raywenderlich.com/3-firebase-tutorial-getting-started

1 个答案:

答案 0 :(得分:0)

您关注的tutorial在代码中这样说:它将打印:

// 5
print(rootRef.key)   // prints: ""
print(childRef.key)  // prints: "grocery-items"
print(itemsRef.key)  // prints: "grocery-items"
print(milkRef.key)   // prints: "milk"

不可能(或者至少对我来说不可行)说出为什么结果不同的原因。可能是SDK行为的改变,也可能是Swift行为的改变,但是这同样也像该文章在显示输出时将其重点放在它的Firebase方面而不是Swift方面一样。

但是,让我们专注于差异以及如何在应用程序中处理差异。

差异:

  • 第一个print(rootRef.key)会为您打印nil,而根据教程会打印""

    尽管Swift SDK的Firebase文档没有说出关于根密钥的任何具体信息,但Android SDK的文档对此内容的说明是DataSnapshot.getKey()

      

    此快照的源位置的键名;如果此快照指向数据库根,则为 null。

    我很快进行了测试,JavaScript和Android SDK的确也打印了null

    换句话说:您所看到的行为是预期的:由于您正在打印数据库根的密钥,因此值为nil / null

  • 您的其他键将打印为Optional(<value>),而本教程仅打印<value>

    这也是预期的行为。由于(如第一个打印语句所示)键可以是nil或值,因此其类型为Optional<String>。而且,当您打印可选字符串时,Swift会将其打印为nil(如第一行所示)或Optional(<value>)

    如果您只想按照本教程中的说明打印值,则可以使用print(childRef.key!)(如果确定键不是指向根),否则可以使用print(rootRef.key ?? "nil")

    有关打印可选内容的更多信息,请参见How to remove Optional from String Value Swift