在firebase

时间:2018-02-09 04:38:55

标签: swift firebase firebase-realtime-database

我正在开发一个firebase项目,并决定对数据结构进行一些更改。现在,我决定将占位符图像添加到下面的节点会更好(之前,我使用虚拟图像作为占位符)。有没有办法让我仍能得到以下日期?并将占位符URL添加到另一个结构?

Structure

所以我想要的是一个数组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)
        }
    })
}

1 个答案:

答案 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时,您都会获得日期和占位符。