Попробуйте изменить формат 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: - Вы также должны обновить свои правила безопасности для работы с различными состояниями аутентификации.
** да ** на вопрос «можно ли запросить базу данных, поэтому я получаю все дочерние элементы, где user_uid равен пользователю, который я предоставляю?» –
и как бы я это сделал? @ EICaptainv2.0 –
Вы нашли ответ еще? – UmarZaii