Отправка данных в Firebase в виде массива дает мне ошибки - PullRequest
0 голосов
/ 30 мая 2018

На данный момент моя база данных структурирована так, что работает для меня.Но вот несчастье, которое я имею - эти два узла, разделенные автоматически идентификаторами, на самом деле являются одним и тем же постом.

Если вы видите, что предыдущая структура моей БД была структурирована (с использованием массива), вы увидите, что в каждом сообщении может быть несколько изображений, дат и планов.которая работала хорошо, но вызывала у меня кошмары при попытке получить доступ к индексам и тому подобное.Поэтому я перешел на этот более рекомендуемый способ.Но сейчас у меня проблемы с группировкой сообщений.Например, эти два ниже должны быть отделены от одного и того же поста.

Как я могу быть уверен, что при чтении данных из моей БД я сгруппирую каждый узел автоматического идентификатора вместе с их соответствующимиposts? т.е.: эти два узла на самом деле являются одним и тем же сообщением - как вы можете сказать по ним, каждый из которых имеет одинаковое название.

   Planit
     -LETR-XJvQsZCOpG-T1N
        Uid: "ZjtJdkjzuxc0mZn4u9TfWsXa9jh2"
        date: "Jun 9, 2018 at 10:00 AM"
        image: "https://img.evbuc.com/https%3A%2F%2Fcdn.evbuc.c..
        plan: "Bike Rodeo, Safety Presentation and Riding Tour o"
        title: "This weekend Plans?"

     -LETR-XKqXf7NY1gh6Jm
        Uid: "ZjtJdkjzuxc0mZn4u9TfWsXa9jh2"
        date: "Jun 11, 2018 at 10:00 AM"
        image: "https://img.evbuc.com/https%3A%2F%2Fcdn.evbuc.c..
        plan: "Fun night out at the Parlor"
        title: "This Weekend Plans?""

Моя БД ранее была структурирована таким образом - который отлично работал на функциональном уровне, но ошибался принципами программирования Firebase.и я только добавляю это, чтобы вы могли сказать структуру, которая мне действительно нужна, эти сообщения должны быть каким-то образом сгруппированы так, чтобы, когда я читаю из FB и загружаю их в табличное представление, соответствующие данные сохраняются вместе - Например - 1 сообщение может иметь 2 изображения, 2 плана и 2 даты, но только 1 НАЗВАНИЕ (сообщения).

Plant: 
 -LETYTJh1WEHGgGcVCEp
    dates
       0: " "
       1: " "
    images
       0: " "
       1: " "
    plans
       0: " "
       1: " "
    senderId
       0: " "
    title: close

Ниже приведена функция, которую я использую для отправки данных.в Firebase - я перебрал массив, чтобы каждая итерация выдвигала изображения, даты, планы, заголовки как одну «связку».

    for planits in chosenPlanArray {
        DataService.instance.uploadPlanitData(withTitleOfPlan: [planits.nameOfEvent!], 
           withDate: [planits.eventStartsAt!], 
           withImage: [planits.imageForPlan!], 
           withTitle: nameOfPlanit.text!, 
           forUID: (Auth.auth().currentUser?.uid)!, 
           sendComplete: { (isGood) in

            if isGood {

            }
        })
    }

И вот моя фактическая реализация в классе обслуживания данных

func uploadPlanitData(withTitleOfPlan plan: [String], withDate: [String], withImage: [String], withTitle: String, forUID uid: String, sendComplete: @escaping (_ status: Bool) -> ()) {


    _REF_PLANITS.childByAutoId().updateChildValues(["plan" : plan, "date" : withDate, "image": withImage, "title": withTitle, "Uid": uid])
    sendComplete(true)
}

1 Ответ

0 голосов
/ 08 июня 2018

Мне кажется, я понимаю вопрос, и есть несколько способов его решить.

1) Группа внутри поста

PlanIt
 plans
  -LETR-XJvQsZCOpG-T1N
    Uid: "ZjtJdkjzuxc0mZn4u9TfWsXa9jh2"
    date: "20180609"
    images:
       image_0: "https://img.evbuc.com/https%3A%2F%2Fcdn.evbuc.c.."
       image_1: "https://img.evbuc.com/https%3A%2F%2Fcdn.evbuc.c.."
    plans
       plan_0: "Bike Rodeo, Safety Presentation and Riding Tour o"
       plan_1: "Bike Rodeo, Safety Presentation and Riding Tour o"
    title: "This weekend Plans?"
  -Yjijiioimoifijjiuee
    Uid: "asdaasdas"
    etc

Ключиimage_0, image_0, plan_0, plan_1 и т. д. будут созданы с помощью childByAutoId.

При этом вы можете загрузить публикацию один раз и получить с ней все необходимые дочерние данные.

Обратите внимание, что покаэта структура выглядит «глубокой», что обычно не рекомендуется в Firebase NoSQL, вы не будете выполнять какие-либо запросы к глубоким данным, и эти данные относятся к посту, поэтому в этом случае все в порядке.

2) Денормализация / выравнивание структуры

PlanIt
 plans
  -LETR-XJvQsZCOpG-T1N
    Uid: "ZjtJdkjzuxc0mZn4u9TfWsXa9jh2"
    date: "20180609"
    title: "This weekend Plans?"
  -UYijs09as9jiosdijfi
    Uid: "some uid"
    date: "20180609"
    title: "some title"

 all_images:
    -LETR-XJvQsZCOpG-T1N
       image_0: "https://img.evbuc.com/https%3A%2F%2Fcdn.evbuc.c.."
       image_1: "https://img.evbuc.com/https%3A%2F%2Fcdn.evbuc.c.."

 all_plan_details
    -LETR-XJvQsZCOpG-T1N
       detail_0: "Bike Rodeo, Safety Presentation and Riding Tour o"
       detail_1: "Bike Rodeo, Safety Presentation and Riding Tour o"

второй вариант потребует начальной загрузки почтового узла для получения его ключа и затем одного вызова узла all_images для загрузки изображений и вызовачтобы все планы, чтобы получить его планы.Обратите внимание, что я использую ключ posts для ссылки на дочерний узел all_images и all_plans.

Идея заключается в том, что мы используем ключ дочернего элемента PlanIt в качестве ссылки на этот узел в узле all_images и all_plans.image_0, image_1, plan_0, plan_1 - это ключи, сгенерированные с помощью .childByAutoId

Второй вариант довольно крутой, потому что, например, у вас есть табличное представление со списком только заголовков и дат, а затем, когда пользователь нажимает на него,Вы можете загружать изображения или планы в другое представление ... Этот параметр будет загружать намного меньше данных за раз, что делает его немного более управляемым с точки зрения памяти.

РЕДАКТИРОВАТЬ

Чтобы прояснить процесс, вот код, который нужно прочитать в плане, изображениях и деталях плана и распечатать их на консоли на основе структуры выше.

let mainRef = self.ref.child("PlanIt")
let plansRef = mainRef.child("plans")
let allImagesRef = mainRef.child("all_images")
let allPlanDetailsRef = mainRef.child("all_plan_details")

plansRef.observeSingleEvent(of: .value, with: { snapshot in

 for child in snapshot.children {
     let childSnap = child as! DataSnapshot
     let dict = childSnap.value as! [String: Any]
     let planKey = childSnap.key
     let title = dict["title"] as! String

     let thisPlansImagesRef = allImagesRef.child(planKey)
     let thisPlansDetailsRef = allPlanDetailsRef.child(planKey)
     thisPlansImagesRef.observeSingleEvent(of: .value, with: { imageSnapshot in

         thisPlansDetailsRef.observeSingleEvent(of: .value, with: { planDetailSnapshot in
             //printing is done here because firebase is asynchronous and all data 
             //  will be valid for each node ONLY at this point
             print("plan: \(planKey)  \(title)")
             for imageChild in imageSnapshot.children {
                 let imageChildSnap = imageChild as! DataSnapshot
                 let image = imageChildSnap.value as! String
                 print("  image: \(image)")
             }

             for planDetailChild in planDetailSnapshot.children {
                 let planDetailChildSnap = planDetailChild as! DataSnapshot
                 let planDetail = planDetailChildSnap.value as! String
                 print("  planDetail: \(planDetail)")
             }
         })
     })
  }
})

, и результат будет:

plan: plan_0  This weekend plans
  image: some image for plan_0
  image: another_image for plan_0
  planDetail: some plan detail for plan_0
  planDetail: another plan detail for plan_0
plan: plan_1  Next weekend plans

Я добавил несколько текстовых значений в свою Firebase, чтобы было более понятно, что происходит в выводе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...