【发布时间】:2020-05-20 10:09:18
【问题描述】:
我正在使用带有 swift 的 Firebase(确切地说是 SwiftUI),并且由于我的数据库包含许多记录(超过 10k 条记录),我试图只从数据库中提取相关数据(否则它会在每个浪费时间)。
我认为我应该使用 .indexOn 但我真的不知道该怎么做(我对 json 没有太多经验)。
这是我尝试使用的 SWIFT 代码:
ref.child("Items").observeSingleEvent(of: .value, with: { (snapshot) in
for child in snapshot.children {
let snap = child as! DataSnapshot
// Doing stuff here.
}
})
这是我的数据结构:
tbl (the actual table):
items:
____:
serial:
date:
more parameters...:
____:
serial:
date:
等等……
空白点 (___:) 表示由 Firebase 自动生成的名称(只是从 0 到表中记录数量的随机数),我想通过查询拉出包含匹配序列的特定记录.
这就是我在 Firebase DB 中的规则的样子:
{
"rules": {
".read": true,
".write": false
}
}
我应该如何在我的 Firebase 规则中使用 .indexOn? 或者有没有其他方法可以得到我想要的?
提前致谢。
更新:
我正在尝试从查询中获取特定记录。根据我上面指定的数据结构,我要获取的是序列号与我将输入到查询中的序列号匹配的孩子的序列号和日期。
假设我想在查询中使用 X8M9320C。 我想得到的是序列号(X8M9320C)和表中返回的日期。
另外,___: 的命名是一个自动生成的数字,当我将 json 文件上传到 Firebase 时会自动初始化。
经过一些调试,我看到运行查询后,我从行中获取了 0 个值:
let childSnaps = snapshot.children.allObjects as! [DataSnapshot]
完整代码:
let serial = "XCM8320CMW"
let myDataRef = self.ref.child("tbl")
let itemsRef = myDataRef.child("items")
let query = itemsRef.queryOrdered(byChild: "serial").queryEqual(toValue: serial)
query.observeSingleEvent(of: .value, with: { snapshot in
let childSnaps = snapshot.children.allObjects as! [DataSnapshot]
guard let firstChild = childSnaps.first else {return}
let date = firstChild.childSnapshot(forPath: "date").value as? String ?? "No Date"
print(date)
})
【问题讨论】:
-
.indexOn 与此任务无关。您正在寻找 Query 以获得特定的子节点(或节点)。我们需要更多信息,但要澄清一下,___ 不应是 (1, 2, 3) 等中的随机数 - 它可能是使用 .childByAutoId 生成的密钥,看起来像
-JyisISkjmosis89。如果不是,我们需要知道它是什么。我们还需要知道您具体查询的是什么——您想从数据库中取回什么。请更新问题并提供更多详细信息,我们将进行查看。 -
将密钥上传到 FireBase 后会自动生成。它实际上是一个数字,代表我认为来自原始 json 文件的索引。我刚刚更新了问题
-
请在您的问题中提供完整的代码 - 单行代码对我们没有帮助,因为故障出现在之前的代码中。顺便说一下。如果您正在查询字符串
X8M9320C,那么您将没有匹配项,因为该字符串不存在。 Howerver 字符串_____X8M9320C_____确实 - 我使用 ____ 来表示空格,因为 cmets 不支持这些。 -
再次更新:)
-
对。请参阅我上面的评论,
let serial = "XCM8320CMW"将不返回任何结果,因为您的数据库中不存在该字符串。