2016-07-11 22 views
1

私はJSONに新しいですし、私は多くの方法を試してみましたが、ユーザーBが見ることができるように、ユーザーB(で主演ポストを返すクエリを把握することはできませんリアルタイムデータベースのfirebaseサンプルコードhttps://github.com/firebase/quickstart-android/tree/master/database特定のユーザーが投稿した投稿を返信する方法は?

で遊んでいます彼が以前に気に入った投稿) 別のツリーを構築する必要はありますか?私が試した

問合せ:

public Query getQuery(DatabaseReference databaseReference) { 
    // All my posts 

    return databaseReference.child("posts").child("stars").child(getUid()).equalTo(true); 

} 

マイJSONツリー:

{ 
    "posts":{ 
     "-KMPiC6Okoe2dd35keT6":{ 
     "author":"user A", 
     "body":"post by user A", 
     "starCount":1, 
     "stars":{ 
      "user B":true 
     }, 
     "timeStamp":"1468253393509", 
     "title":"post by user1", 
     "uid":"user A", 
     "viewCount":0 
     }, 
     "-KMPiIHQXrZIfnv2uNV-":{ 
     "author":"user B", 
     "body":"post by user B", 
     "starCount":0, 
     "timeStamp":"1468253419640", 
     "title":"post by user B", 
     "uid":"user B", 
     "viewCount":0 
     } 
    }, 
    "user-posts":{ 
     "user A":{ 
     "-KMPiC6Okoe2dd35keT6":{ 
      "author":"user A", 
      "body":"post by user A", 
      "starCount":1, 
      "stars":{ 
       "user B":true 
      }, 
      "timeStamp":"1468253393509", 
      "title":"post by user A", 
      "uid":"user A", 
      "viewCount":0 
     } 
     }, 
     "user B":{ 
     "-KMPiIHQXrZIfnv2uNV-":{ 
      "author":"lui", 
      "body":"post by user 2", 
      "starCount":0, 
      "timeStamp":"1468253419640", 
      "title":"post by user 2", 
      "uid":"user B", 
      "viewCount":0 
     } 
     } 
    }, 
    "users":{ 
     "user A":{ 
     "email":"[email protected]", 
     "username":"user A" 
     }, 
     "user B":{ 
     "email":"[email protected]", 
     "username":"user B" 
     } 
    } 
} 

答えて

3

まず、あなたは参照が不足している:

// Old 
databaseReference.child("posts").child("stars").child(getUid()).equalTo(true); 

// New 
databaseReference.child("posts").child(some-post).child("stars").child(getUid()).equalTo(true); 

しかし、まだこれは、非常に困難またはだろう返されたデータを調べる必要はなく、検索をまっすぐに行うことは不可能です。

私が行うべきことは、usersツリーを作成し、ユーザーの代わりに投稿にスタ​​ー付きの投稿を書き込むことです。例えば:

"users": { 
    "userA": { 
     "starred": { 
      "-KMP3242nf23nfn23": { 
       "author": "userB", 
       "post": "-KMPiC6Okoe2dd35keT6" 
      }, 
      "-KMPiIHQXrZIfnv2uNV-": { 
       "author": "userB", 
       "post": "-KMPiC6Okoe2dd35keT6" 
      }, 
      ... 
     } 
    } 
} 

starredへの新しいスターを付けた記事を押す)すると、次のようなクエリを作ることができる:

// Get a list of posts starred 
... databaseReference.child("users").child(getUid()).child(starred); 
// Iterate through and get value of `author` and `post` 
... 
// Store the values in variables 
var author = "..."; 
var post = "..."; 

// Make the call 
return databaseReference.child("posts").child(post); 

その他の参照:ご質問とFirebase - How do I write multiple orderByChild for extracting data?

コメント。

+0

私は見ていますが、some-postは新しいデータが追加されたときにランダムに生成されるpost-idです。このpost-id変数はどのようにして見つけられますか? –

+0

ユーザーが投稿した投稿を返信するのではなく、ユーザーが投稿した投稿を返しますか? –

1

これは、ここではかなりまっすぐ進む深いクエリ

あるプラットフォームが指定されていなかったので、(v2.xのFirebaseを使用して)スウィフトソリューションです。

let ref = self.myRootRef.childByAppendingPath("posts") 

    ref.queryOrderedByChild("stars/user B").queryEqualToValue(true) 
      .observeEventType(.Value, withBlock: { snapshot in 

     if (snapshot.value is NSNull) { 
      print("not found") 
     } else { 
      for child in snapshot.children { 

       let key = child.key as String 
       let author = child.value["author"] as! String 
       print("key = \(key) author = \(author)") 

      } 
     } 
    }) 

これは

key = -KMPiC6Okoe2dd35keT6 author = user A 

が印刷されますし、また、条件に一致する他のノードが存在する場合、彼らは同様に印刷されます。

関連する問題