2016-11-23 5 views
0

Я пытаюсь использовать Firebase 3 и Swift 3, чтобы создать приложение, которое позволяет пользователям создавать «тесты», и цель заключается в том, что вам будет показан полностью случайный тест из база данных.Получить случайный ребенок из базы данных Firebase

Моего стола:

Users: 
- uid 
    - email 

tests 
    - id 
     - title 
     - user_uid 

Как случайным образом выбрать любой ребенок из «тестов», так что я могу показать их пользователю? Должен ли я каким-то образом изменить структуру?

Под этим я имею в виду позволяет сказать, что у меня есть это:

tests: 
- 12391239123 
    - title: "My first test" 
    - user_uid: 12312345 
- 59696995883 
    - title: "Second test" 
    - user_uid 12352355 

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

Также можно запросить базу данных, поэтому я получаю все дочерние элементы, где user_uid равен пользователю, который я предоставляю? Если да, то как?

+1

** да ** на вопрос «можно ли запросить базу данных, поэтому я получаю все дочерние элементы, где user_uid равен пользователю, который я предоставляю?» –

+0

и как бы я это сделал? @ EICaptainv2.0 –

+0

Вы нашли ответ еще? – UmarZaii

ответ

0
  • Прежде всего, вы должны запросить все данные из firebase. Затем вы можете использовать обычную случайную функцию, чтобы получить случайное значение из снимка. (Вторая часть)
  • Для запроса на основе идентификатора пользователя можно использовать следующий код (первая часть)

    ref.child("users").queryEqualToValue("userId").observeEventType(.Value, withBlock: { snapshot in 
    print(snapshot) 
    } 
    
    
    
    
    for _ in 1...10 { 
    //generate a random number between 1 and the amount of questions you have 
    var randomNumber = Int(arc4random_uniform(amountOfQuestions - 1)) + 1 
    
    //The reference to your questions in firebase (this is an example from firebase itself) 
    let ref = Firebase(url: "https://dinosaur-facts.firebaseio.com/dinosaurs") 
    //Order the questions on their value and get the one that has the random value 
         ref.queryOrderedByChild("value").queryEqualToValue(randomNumber).observeEventType(.ChildAdded, withBlock: { snapshot in 
    //Do something with the question 
    println(snapshot.key) 
    }) 
    } 
    
+0

, так что скажем, у меня 100 000 пользователей в моей базе данных, я должен получить 100 000 значений? вы уверены, что это оптимальное решение? –

+0

Это может быть не оптимальное решение, но для этой цели нет конкретной функции, предоставляемой firebase. –

2

Попробуйте изменить формат JSON дерево на это: -

Users: 
    - uid 
    - email 

tests 
    - noOfTotalTest : 4 // Lets say 4 
    - id 
    - title 
    - user_uid 
    - index // Just index of the post 

Теперь используйте этот кодоблок: -

FIRDatabase.database().reference().child("tests/noOfTotalTest").observeSingleEvent(of: .value, with: {(Snap) in 


     let totalNoOfTest = Snap.value as! Int 
     print(totalNoOfTest) 
     let randNum = Int(arc4random_uniform(UInt32(totalNoOfTest))) + 1 
     print(randNum) 
     FIRDatabase.database().reference().child("tests").queryOrdered(byChild: "index").queryEqual(toValue: randNum).observeSingleEvent(of: .value, with: {(Snapshot) in 

      print(Snapshot.value!) 

     }) 
    }) 

Теперь, когда вы размещаете тест на вашей базе данных вы должны сделать эти вещи: -

  • Запрос общее количество тестов в БД, noOfTotalTest
  • После того, как извлеченный увеличить на + 1 и обновить noOfTotalTest и поместить его в с другими испытываемых деталей и установить его в БД
  • и процесс осуществляет ....

PS: - Для создания поста только/Saving: -

FIRDatabase.database().reference().child("tests/noOfTotalTest").observeSingleEvent(of: .value, with: {(Snap) in 

if Snap.exists(){ 

      // This is not the first post 

      let totalNoOfTest = Snap.value as! Int 

      FIRDatabase.database().reference().child("tests").childByAutoId().setValue(["userID" : UID, "details" : Details, "index" : totalNoOfTest + 1]) 
    FIRDatabase.database().reference().child("tests/noOfTotalTest").setValue(totalNoOfTest + 1) 
     } else { 

     // This is your first post 

     FIRDatabase.database().reference().child("tests").childByAutoId().setValue(["userID" : UID, "details" : Details, "index" : 1]) 
    FIRDatabase.database().reference().child("tests/noOfTotalTest").setValue(1) 

     } 

}) 

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

Для этого добавьте в ваш JSON дерева: -

active_Indexes :{ 

    12 : true, 
    09 : true, 
    198 : true, 
    11: true, 
    103 : true, 
    } 

Теперь то, что вам нужно, чтобы хранить эти INDEX в словаре, то рандомизации элемент массива: -

var localIndexDirectory = [Int : Bool] 

//Listen to any changes to the database, and update your local index directory accordingly 


override func viewDidLoad() { 
    super.viewDidLoad() 


    FIRDatabase.database().reference().child("active_Index").observe(.childRemoved, with: {(Snap) in 

     print(Snap.value) 
     let keyToBeChanged = Int(Snap.key)! 
     self.localIndexDirectory.removeValue(forKey: keyToBeChanged) 
     print(self.localIndexDirectory) 

    }) 

    FIRDatabase.database().reference().child("active_Index").observe(.childAdded, with: {(Snap) in 

     print(Snap) 
     let keyToBeChanged = Int(Snap.key)! 
     self.localIndexDirectory.updateValue(true, forKey: keyToBeChanged) 
     print(self.localIndexDirectory) 

    }) 
} 

Это будет обновите свой каталог для доступных индексов (SINCE .observe - это непрерывная нить в вашей сетевой нити) в вашей базе данных, тогда вам нужно только рандомизировать эти индексы a t это конкретное время и запрос, который тест для этого конкретного индекса. Но теперь, чтобы активировать функцию Удаление в вашем приложении вы также должны изменить ваши экономии Т.е. функция всякий раз, когда вы сохраняете новый узел в вашу базу данных, убедитесь, что вы также добавьте active_Indexes узел в вашей БД, с этим частности индекс.

PPS: - Вы также должны обновить свои правила безопасности для работы с различными состояниями аутентификации.

+0

Не будет проблем, когда я начну удалять сообщения? Тогда некоторые индексы будут пустыми? –

+0

Я обновил свой ответ. Примите и поддержите это как ответ, если он решит вашу проблему :) Happy Coding – Dravidian

Смежные вопросы