如何从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
答案 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。