我已经查阅了Firebase的文档、Stack Overflow和YouTube教程,但我找不到如何从Firebase获取数据的方法。
我是Firebase的新手,正在将我的项目从Parse转换到Firebase。
例如:我在Firebase中有一个数据,看起来像这样: 我可以通过以下方式在Swift中获取所有主题:
当我遍历for循环时,我打印出像这样的东西:
我的问题是,如何访问数据:
我需要密钥(KYCqk2_AVkUd8s9cKiu) 我需要描述和名称 我需要一个标签数组
- 这些数据都在本地变量中吗?
基本上,我只想读取所有“主题”,并在本地内存中拥有一个“主题”数组。
我可以处理构建类主题数组,但是我尝试了几种方法来获取数据,但没有成功。肯定有一种简单的方法来解析结果,但我还没有找到例子或文档。
希望得到一些帮助或指向某些文档或教程的指针。
=================================
更新代码
嗨,我改变了代码以尝试匹配提供的示例。代码现在看起来像下面这样 我放了一个循环计数器来查看正在发生什么以及为什么会崩溃。
FDataSnapshot未定义,因此我使用了FIRDataSnapshot。
以下是新代码尝试,现在会崩溃。更低下面,我展示了使其不崩溃的更改 - 以及有关安全处理标记子节点的问题。感谢您的指针。我现在有了可行的东西。
我没有定义任何断点 - 但是代码在这个断点处停止了(当我确定没有定义任何断点时)。
如果我将这行改为使用“Any”……那么它就可以工作了。
新的工作代码....
我从其他回复发送的文档链接中找到了主题关键字,谢谢。
我不确定我是否正确获取标签值。实际上它只是一个字典,我试图将其转换为字典,但运行时崩溃并想要将标签转换为NSArray...所以我在代码中这样做,并且它可以工作,但不确定是否安全,因为尽管它返回为数组,但它并未定义为数组。
我是Firebase的新手,正在将我的项目从Parse转换到Firebase。
例如:我在Firebase中有一个数据,看起来像这样: 我可以通过以下方式在Swift中获取所有主题:
let refDB = FIRDatabase.database().reference(fromURL: firebaseDB_URL)
let topicsRef = refDB.child("topics")
// FIRDataSnapshot.
topicsRef.observe(.value, with: { snapshot in
for child in snapshot.children {
print("child ------")
print(child)
// Get the bits HOW DO I PARSE EACH SET
}
})
当我遍历for循环时,我打印出像这样的东西:
child ------
Snap (-KYCqk2_AVkUd8s9cKit) {
createdBy = FeMFeeDat4VZb5tmFO2tKixgQIy1;
description = "Match states with their capitals";
name = "State Caiptals";
tags = {
0 = Geography;
1 = USA;
};
}
child ------
Snap (-KYCqk2_AVkUd8s9cKiu) {
createdBy = FeMFeeDat4VZb5tmFO2tKixgQIy1;
description = "Name the parts of an Atom";
name = "Parts of an Antom";
tags = {
0 = Physics;
1 = Atom;
2 = Electron;
};
}
我的问题是,如何访问数据:
我需要密钥(KYCqk2_AVkUd8s9cKiu) 我需要描述和名称 我需要一个标签数组
- 这些数据都在本地变量中吗?
基本上,我只想读取所有“主题”,并在本地内存中拥有一个“主题”数组。
我可以处理构建类主题数组,但是我尝试了几种方法来获取数据,但没有成功。肯定有一种简单的方法来解析结果,但我还没有找到例子或文档。
希望得到一些帮助或指向某些文档或教程的指针。
=================================
更新代码
嗨,我改变了代码以尝试匹配提供的示例。代码现在看起来像下面这样 我放了一个循环计数器来查看正在发生什么以及为什么会崩溃。
FDataSnapshot未定义,因此我使用了FIRDataSnapshot。
以下是新代码尝试,现在会崩溃。更低下面,我展示了使其不崩溃的更改 - 以及有关安全处理标记子节点的问题。感谢您的指针。我现在有了可行的东西。
// HERE is a way to get all the Topics
let refDB = FIRDatabase.database().reference(fromURL: firebaseDB_URL)
let topicsRef = refDB.child("topics")
// FIRDataSnapshot.
topicsRef.observe(.value, with: { snapshot in
if snapshot.value is NSNull {
print("not found")
} else {
var loopCount = 1 // count loops to see how may time trying to loop
for child in snapshot.children {
print(" ")
print(" ")
print("child ------ loop \(loopCount)")
print(child)
let snap = child as! FIRDataSnapshot //each child is a snapshot
let dict = snap.value as! [String: String] // the value is a dictionary
let name = dict["name"]!
let description = dict["description"]!
let createdBy = dict["createdBy"]!
print("the bits ------")
print("name .... \(name)")
print("description .... \(description)")
print("createdBy .... \(createdBy)")
loopCount += 1
}
}
})
我没有定义任何断点 - 但是代码在这个断点处停止了(当我确定没有定义任何断点时)。
libswiftCore.dylib`_swift_bridgeNonVerbatimFromObjectiveC:
0x1144a4270 <+0>: pushq %rbp
0x1144a4271 <+1>: movq %rsp, %rbp
0x1144a4274 <+4>: pushq %r15
... 在这里断了三次,然后应用程序在这一行崩溃了:
let dict = snap.value as! [String: String]
并显示消息 "Thread 1: EXC_BAD_INSTRUCTION (code=EXEC_1386_INVOP, subside=0x0)"。
我不确定为什么代码会出现断点和崩溃。可能是因为当遇到tags时崩溃了,因为tags是子节点,不符合[String,String]的格式。
我在日志中打印了这个东西,然后就崩溃了!!!
child ------ loop 1
Snap (-KYI2MszjC9pK_4oIvKu) {
createdBy = FeMFeeDat4VZb5tmFO2tKixgQIy1;
description = "Match states with their capitals";
name = "State Caiptals";
tags = {
0 = Geography;
1 = USA;
};
}
如果我将这行改为使用“Any”……那么它就可以工作了。
let dict = snap.value as! [String: Any]
新的工作代码....
// HERE is a way to get all the Topics
let refDB = FIRDatabase.database().reference(fromURL: firebaseDB_URL)
let topicsRef = refDB.child("topics")
// FIRDataSnapshot.
topicsRef.observe(.value, with: { snapshot in
if snapshot.value is NSNull {
print("not found")
} else {
var loopCount = 1 // count loops to see how may time trying to loop
for child in snapshot.children {
print(" ")
print(" ")
print("child ------ loop \(loopCount)")
let snap = child as! FIRDataSnapshot //each child is a snapshot
if snap.value != nil {
print("key ... \(snap.key)")
let dict = snap.value as! [String: Any] // the value is a dictionary
let name = dict["name"] as! String
let description = dict["description"] as! String
let createdBy = dict["createdBy"] as! String
let tags = dict["tags"] as! NSArray
/* Thought I could loop tags as! Dictionary but that does not work. Compiles but runtime crashes.
var tagsArray = [String]()
if tags != nil && tags.count > 0 {
for (key, value) in tags {
tagsArray.append(value)
}
} */
// Test to see what we got ...
print("the bits ------")
print("name .... \(name)")
print("description .... \(description)")
print("createdBy .... \(createdBy)")
print("tags ... \(tags) ... count \(tags.count)")
loopCount += 1
} else {
print("bad snap")
}
}
}
})
我从其他回复发送的文档链接中找到了主题关键字,谢谢。
我不确定我是否正确获取标签值。实际上它只是一个字典,我试图将其转换为字典,但运行时崩溃并想要将标签转换为NSArray...所以我在代码中这样做,并且它可以工作,但不确定是否安全,因为尽管它返回为数组,但它并未定义为数组。