2016-11-23 10 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とuser uidが等しいすべての子を取得できますか?もしそうなら、どうですか?

+1

**はい**質問に「データベースを照会することができるので、user_uidが私が提供するユーザーIDと等しいすべての子を取得できますか? –

+0

と私はこれをどのようにしますか? @ EICaptainv2.0 –

+0

答えはまだ見つかりませんでしたか? – UmarZaii

答えて

0
  • まず、firebaseからすべてのデータを照会する必要があります。その後、スナップショットからランダムな値を取得するには、通常のランダム関数を使用することができる。(第二部分)
  • ユーザIDに基づいてクエリを実行するには、次のコード(前編)

    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ツリーを変更してみてください: - :

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!) 

     }) 
    }) 
-

Users: 
    - uid 
    - email 

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

は今、このコードブロックを使用noOfTotalTest

  • に、DB内のテストの無い合計取得後インクリメントそれによって+を

    • クエリ - :あなたが得たあなたのデータベースにテストを投稿するたびに210

      は今、これらのことを行います1とnoOfTotalTestを更新し、テストの詳細の他にそれを入れて、あなたのDB

    • に設定し、プロセスは上....
    • 運びます

    PS: - ちょうど/ セービングポストを作るための: -

    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, 
        } 
    

    は今、あなたが辞書にこれらのインデックスを格納することで必要なものは、配列の要素をランダム化: -

    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は、ネットワークスレッドの連続スレッドです)に対して、ディレクトリを更新しておく必要があります。これらのインデックスをランダム化するだけですその特定の時間とその特定のインデックスの試験を照会します。しかし、あなたのアプリケーションで削除機能を有効にするには、の機能を変更する必要があります。つまり、新しいノードをデータベースに保存するときは、active_IndexesノードもDBに追加してくださいインデックス。

    PPS: -あなたはまた、別の認証状態に対処するためのセキュリティルールを更新する必要があります。

  • +0

    私は投稿を削除し始めても問題ありませんか?その後、いくつかのインデックスは空になりますか? –

    +0

    私は自分の答えを更新しました。受け入れ、upvoteこれはあなたの問題を解決した場合の答えとして:)ハッピーコーディング – Dravidian

    関連する問題