【发布时间】:2021-08-27 15:49:56
【问题描述】:
我正在尝试使用 swiftUI 检索我的 Firebase 数据库的特定子项。为此,我使用简单的表达式
func addListeners() {
let database = Database.database(url: "https://someUrl")
let ref = database.reference(withPath: "users")
let currentUserId = "u3Ebr6M3BAbP7PBSYYJ7q9kEe1l2"
let drivingTowardsRef = database.reference(withPath: "users/\(currentUserId)/drivingTowardsUsers")
print("Loading data from \(drivingTowardsRef)")
//THIS RIGHT HERE IS CAUSING THE PROBLEM
ref.observe(.childAdded) { snapshot in
print("Got TOP LEVEL data for user \(snapshot.key): \(String(describing: snapshot.value))")
}
//---------------------------------------
drivingTowardsRef.observe(.childAdded) { snapshot in
ref.child(snapshot.key).getData { (error, userSnapshot) in
if let error = error {
print(error)
} else {
print("Got arriving user data \(snapshot.key): \(String(describing: userSnapshot.value))")
}
}
}
}
该函数只会返回整个数据库数据
编辑:在这种情况下,该函数返回来自第一个观察者参考顶层的数据 users/ 在我的情况下有两个元素:niixi6iORjNn8gWq6tKvSi3Bxfc2, u3Ebr6M3BAbP7PBSYYJ7q9kEe1l2
Got arriving user data niixi6iORjNn8gWq6tKvSi3Bxfc2: Optional({
niixi6iORjNn8gWq6tKvSi3Bxfc2 = {
aproxTime = 0;
distance = 0;
latitude = "37.33070704";
longitude = "-122.03039943";
parkingMode = searching;
userId = niixi6iORjNn8gWq6tKvSi3Bxfc2;
username = testeroNumero;
};
u3Ebr6M3BAbP7PBSYYJ7q9kEe1l2 = {
aproxTime = 0;
distance = 0;
drivingTowardsUsers = {
niixi6iORjNn8gWq6tKvSi3Bxfc2 = {
approxTime = 0;
distance = "560.1447571016249";
};
};
latitude = "37.32984184";
longitude = "-122.02018095";
parkingMode = offering;
userId = u3Ebr6M3BAbP7PBSYYJ7q9kEe1l2;
username = cleoBadu;
};
我传递给他的子路径的密钥似乎是正确的,但它仍然返回整个顶级集合而不是单个项目...
编辑:问题似乎出在第一个观察者身上,它弄乱了 ref.child(snapshot.key) 的 .getData()。这可能吗?
只需注释掉 ref.observe(.childAdded) 将自动使第二个 ref.child(snapshot.key) 行为完全正常 我错过了什么?
我可以将整个数据库作为一个大型字典获取,然后从那里获取我想要的孩子,但这似乎并不传统,尤其是当谷歌的图书馆提供不这样做的可能性时。
EDIT:我添加了一个打印语句,用于打印数据库 ref 的 url。如果我随后在浏览器上输入 url,它会将我重定向到 FRT 数据库并让我登陆正确的对象。所以它生成的 url 是正确的并且工作得很好。
getData() 返回的对象仍然是整个 db
SN:我删除了所有可编码的结构,因为这不是问题,所以问题更关注实际问题
EDIT:创建了一个简单的视图。在一个干净的项目上它适用于我的项目它没有。我猜这是某种配置,但很难调查。
问题:无论我传递给他什么孩子(字符串),它都会返回整个顶级数据(替换快照.key)。例如:我传key“something”->返回所有用户,我传key“”返回所有用户
【问题讨论】:
-
你能把完整的代码贴出来吗?
-
添加完整代码
-
在图片中发布
ParkingUser Codable结构和您的 firebase 结构 -
还添加了可编码结构
-
我尝试重现该问题,但无法重现。由于信息太长,无法发表评论,我将其写在下面作为答案。
标签: swift firebase firebase-realtime-database