我正在开发一个firebase项目,并决定对数据结构进行一些更改。现在,我决定将占位符图像添加到下面的节点会更好(之前,我使用虚拟图像作为占位符)。有没有办法让我仍能得到以下日期?并将占位符URL添加到另一个结构?
所以我想要的是一个数组dates = ["20180203","20180204","20180205"]
,然后是另一个包含placeholders = ["https.googleapis.whateverIsInTheDay80180203", "https.dummydefaultimage","https.dummydefaultimage"]
的数组
public func getAvailableDates(spotTitle:String, handler: @escaping (_ dateList:[String])->())
{
var datesList:[String] = []
let formatter = DateFormatter()
formatter.dateFormat = "yyyyMMdd"
let allowedDays = 30
ref.child("ImageLocationDates").child(spotTitle).observe(DataEventType.value, with: { (snapshot) in
if snapshot.childrenCount > 0 {
for mydata in snapshot.children.allObjects as! [DataSnapshot]
{
let date = mydata.key
if date.count == 8 {
let testDate = formatter.date(from: date)
let cal = Calendar.current
let components = cal.dateComponents([.day], from: testDate!, to: cal.startOfDay(for: Date()))
let dateDistance = components.day! // integer of distance between today and date provided
if dateDistance < allowedDays {
if !datesList.contains(convertDate(stringDate: date)){
datesList.insert(convertDate(stringDate: date), at: 0)
}
else {
print("getting duplicate data")
}
}
}
}
handler(datesList)
}
})
}
答案 0 :(得分:0)
在 Firebase实时数据库中,您可以通过几种方法构建数据。请记住,您希望您的数据不会太深。通常我的限制是3倍不多。为了保持浅薄,您可以对数据进行规范化和分发,有时会包含一些重复,但它可以加快查询速度并减少用户每次下载的数据量。
请看下面的三个结构:
<强>(A)强>
D_street:
2012491203 :
placeholder: "https://...."
2012491203 :
placeholder: "https://...."
...
<强>(B)强>
D_street_dates:
2012491203 : true
2012491203 :
...
D_street_placeholder:
2012491203 : "https://...."
2012491203 : "https://...."
...
<强>(C)强>
D_street_dates:
id1 :
date: 2012491203
placeholder: "https://...."
id2 :
date: 2012491203
placeholder: "https://...."
...
根据您的使用情况,上述每种结构都可以很好。在 A 中,您可以按日期(键)查询,一旦获得结果,您实际上也下载了占位符,因为它们是值。
在 B 中,您只在查询D_street_dates时下载日期,然后您必须执行另一个查询以从D_street_placeholder获取每个日期的占位符。
在 C 中,您可以按ID或userID构建数据,或者日期和占位符都是属性的内容,并且每当您查询ID时,您都会获得日期和占位符。