我正在使用Swift中的Xcode 8.2.1编写IOS应用程序。目前,我为一个实现GeoFire的视图控制器设置了数据库,并成功地将位置添加到数据库中。在单独的视图控制器上,我想添加对同一数据库的引用,并将子项添加到此引用。
这个单独的引用我想存储可由数组名称访问的不同数组。我希望能够在数据库中添加和删除已保存的数组。另外,我希望能够添加和删除每个单独数组中保存的字符串。
我尝试的代码是:
let ref = FIRDatabase.database().reference()
let childRef = FIRDatabase.database().reference(withPath: "arrays")
let itemsRef = ref.child("arrays")
let milkRef = itemsRef.child("array1")
但是当我运行此代码时,数据库不会更新以显示任何新子代。有可能完成我的任务吗?如果是这样,我做错了什么?
如果我的问题不清楚,请告诉我,我愿意详细说明。提前感谢您的帮助!
答案 0 :(得分:2)
阅读本文:Arrays are evil
一般来说,最好避免使用它们,因为通常有更好的方法来组织数据。
以下是一些信息:
这会创建一个名为child_node的节点,并为其赋值some_value
let ref = FIRDatabase.database().reference()
let childRef = ref.child("child_node")
childRef.setValue("some_value")
结果
root
child_node: some_value
如果再次运行代码,它将覆盖现有节点。
通常,最好将节点名称与它们包含的数据取消关联,以便扩展一点
let ref = FIRDatabase.database().reference()
let childRef = ref.childByAutoId()
childRef.setValue("some_value")
结果
root
-Y8hjj9a99js9jd: some_value
-Yi00ksomosooss: some_value //the second time it's run
然后再进一步
let ref = FIRDatabase.database().reference()
let childRef = ref.childByAutoId()
let someData = ["site": "Olympus Mons", "location": "Mars"]
childRef.setValue(someData)
结果
root
-Y88ujs9mskkms:
site: "Olympus Mons"
location: "Mars"
那么你问自己'自己,这与数组有什么关系?
这是存储“额外”数据的更好方法。例如,您可以在其节点中存储用户位置
root
users
-Yi8joiomso (uid)
g: xxxx
l:
0: xxx
1: xxx
或保留对其在另一个节点中的位置的引用
root
users
-Yi8joiomso (uid)
location: -Yiuhj89ejee
location
-Yiuhj89ejee
g: xxxx
l:
0: xxx
1: xxx
或将用户保留在位置节点
中root
location
userID
g: xxxx
l:
0: xxxx
1: xxxx
非数组结构为查询,检索数据和组织数据提供了更大的灵活性。