iOS - แบบสอบถามตัวกรอง Firebase

ฉันได้รับโหนดคะแนนใน Firebase:

และภายใต้โหนดคะแนนโครงสร้างข้อมูลของฉันจะเป็นดังนี้:

{
"jjTO29ziQ2SjrH5PFzY7ZMpSgjq1-Kak6FCyGtdy_kcEPd4K" =     {
    jjTO29ziQ2SjrH5PFzY7ZMpSgjq1 = "-Kak6FCyGtdy_kcEPd4K";
    score = 5;
};
"jjTO29ziQ2SjrH5PFzY7ZMpSgjq1-KbE_pgfUsukOm4uW0bx" =     {
    jjTO29ziQ2SjrH5PFzY7ZMpSgjq1 = "-KbE_pgfUsukOm4uW0bx";
    score = 4;
};

คำถาม: ฉันสามารถกรองข้อมูลตามคะแนนได้หรือไม่

ฉันลองทำ:

FIRDatabase.database().reference().child("scores").queryOrdered(byChild: "score").observeSingleEvent(of: .value, with: { (snapshot) in

        debugPrint(snapshot.value ?? "nil")

    })

แต่รับผลไม่ได้ ?

รูปภาพ 1


person user3804063    schedule 25.01.2017    source แหล่งที่มา
comment
คุณสามารถกรองตามข้อมูลด้วย orderByChild แต่ฉันคิดว่าปัญหาของคุณเป็นเพราะคุณได้ป้อนโหนดที่เกี่ยวข้องซึ่งมีคะแนนอยู่ข้างใน เนื่องจากคุณกำลังป้อนคะแนนตั้งแต่ตอนเป็นเด็ก แต่ก่อนอื่นคุณต้องป้อนรหัสแต่ละรหัสของคุณก่อน   -  person Mago Nicolas Palacios    schedule 25.01.2017
comment
อะไรคือปัญหา? debugPrint ถูกเรียกหรือเปล่า?   -  person Frank van Puffelen    schedule 25.01.2017
comment
@MagoNicolasPalacios: ฉันได้ตั้งค่าโหนดตามภาพที่ 1 แล้วหรือยัง? คุณช่วยแนะนำหน่อยได้ไหม?   -  person user3804063    schedule 25.01.2017
comment
@FrankvanPuffelen: ใช่แล้ว มีการเรียกใช้การพิมพ์ดีบั๊ก แต่ข้อมูลไม่ได้เรียงตามคะแนน   -  person user3804063    schedule 25.01.2017
comment
แต่คุณได้รับสิ่งที่ฉันพูดหรือไม่? คุณกำลังป้อนคะแนนแล้วกรองตามคะแนน และคะแนนไม่มีลูกโดยตรงที่ชื่อคะแนน แต่มีลูกที่แตกต่างกัน 2 ลูกซึ่งภายในนั้นมีค่าที่เรียกว่าคะแนน   -  person Mago Nicolas Palacios    schedule 25.01.2017
comment
@MagoNicolasPalacios: ใช่คุณพูดถูก ฉันไม่มีคะแนนลูกโดยตรง ฉันต้องกรอง. ฉันสามารถบรรลุเป้าหมายนี้ได้หรือไม่?   -  person user3804063    schedule 25.01.2017
comment
คุณสามารถ! ฉันคิดว่าคำตอบด้านล่างถูกต้อง (แฟรงค์ ฟาน พัฟเฟเลน)   -  person Mago Nicolas Palacios    schedule 25.01.2017


คำตอบ (1)


เมื่อคุณดำเนินการค้นหากับ Firebase คุณจะได้รับ FIRDataSnapshot ที่มีข้อมูลสามส่วนสำหรับแต่ละผลลัพธ์:

  • กุญแจสำคัญ
  • คุณค่าของมัน
  • ตำแหน่งที่สัมพันธ์กับโหนดอื่น

เมื่อคุณโทร snapshot.value สแน็ปช็อตจะถูกแปลงเป็นพจนานุกรม น่าเสียดายที่พจนานุกรมนั้นเก็บได้เฉพาะคู่คีย์-ค่า ดังนั้นคุณจึงสูญเสียข้อมูลเกี่ยวกับตำแหน่งของโหนด ดังนั้นแม้ว่าข้อมูลในสแน็ปช็อตจะถูกจัดเรียงอย่างถูกต้อง แต่คุณกำลังทิ้งข้อมูลนั้นไป

วิธีแก้ไขคือใช้คุณสมบัติ FIRDataSnapshots ในตัว children เพื่อวนซ้ำโหนดย่อยในลำดับที่ถูกต้อง เอกสาร Firebase เกี่ยวกับการสืบค้นมีตัวอย่างวิธีการนี้ ทำอย่างนั้น:

_commentsRef.observeEventType(.Value, withBlock: { snapshot in
  for child in snapshot.children {
    ...
  }
})
person Frank van Puffelen    schedule 25.01.2017