2017-03-23 4 views
3

クエリ結果からキーを取得する際に問題が発生しています。これは私のFirebaseデータベース構造である:代わりに結果を得ることの私は、このようなランダムコールバックを取得していますなぜFirebaseのクエリからキーを取得する

{ 
    "Users" : { 
    "7idb6ThWR8aqmnEHFao5GRCV1kI3" : { 
     "dPicture" : "https://firebasestorage.googleapis.com/v0/b/parkir-ngasal.appspot.com/o/Profile_images%2Fcropped1465266876.jpg?alt=media&token=44f83fdf-935a-4b3c-8138-561dcba2fca7", 
     "status" : "hi my name is erik", 
     "uid" : "7idb6ThWR8aqmnEHFao5GRCV1kI3", 
     "username" : "erik" 
    } 
    }, 
    "posts" : { 
    "-KfsrGsY8TWb2wiMFtAq" : { 
     "dPicture" : "https://firebasestorage.googleapis.com/v0/b/parkir-ngasal.appspot.com/o/Profile_images%2Fcropped1465266876.jpg?alt=media&token=44f83fdf-935a-4b3c-8138-561dcba2fca7", 
     "image" : "https://firebasestorage.googleapis.com/v0/b/parkir-ngasal.appspot.com/o/Post_Images%2Fcropped1354055061.jpg?alt=media&token=77fbc9ed-4356-43c1-b7bb-9563300a8b7b", 
     "small_title" : "tes", 
     "summary" : "tes", 
     "title" : "tes", 
     "uid" : "7idb6ThWR8aqmnEHFao5GRCV1kI3", 
     "username" : "erik" 
    } 
    } 
} 

私はKfsrGsY8TWb2wiMFtAqを取得しようとしたが、

Query mThisUsersPosts; 

public static final String TAG = "blah" ; 

mDatabasePosts = FirebaseDatabase.getInstance().getReference().child("posts"); 

mThisUsersPosts = mDatabasePosts.orderByChild("uid").equalTo(mCurrentUser); 

mThisUsersPosts.addListenerForSingleValueEvent(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         final String posts_key = dataSnapshot.getChildren().toString(); 
         Log.d(TAG,posts_key); 
        } 

        @Override 
        public void onCancelled(DatabaseError databaseError) { 

        } 
       }); 

の下にこのコードを使用しています、私は理解していません次のように:

[email protected] 
[email protected] 
[email protected] 

事前に感謝します。あなたが複数の投稿をお持ちの場合は

//This assumes Post is the data type you're trying to get. 
final Posts posts = dataSnapshot.getValue(Posts.class); 

を行うことができます:

+0

datasnapshot.getKey()のようにdatasnapshotからアイテムキーを取得できます。 –

+0

こんにちは@ Mohom.R ...それを試みました...それは "投稿"ハハ... 1つのレベルが高すぎるを返す – Jagmaster

+0

私は答えを投稿してください.. –

答えて

2

、潜在的に複数の結果があるだろう、個々のポストのキーを取得するために、支柱の上に反復することです。したがって、スナップショットにはそれらの結果のリストが含まれています。結果が1つだけの場合でも、スナップショットには1つの結果のリストが含まれます。したがって、返されたスナップショットの子を反復して、個々の結果を取得する必要があります。

mThisUsersPosts.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for (DataSnapshot child: dataSnapshot.getChildren()) { 
      System.out.println(child.getKey()); 
      System.out.println(child.child("title").getValue()); 
     } 
    } 

あなたが選んだデータ構造があなたのアプリにとって正しいかどうかは疑問です。あなたの主なユースケースは、特定のユーザーの投稿を表示するなどのデータをモデル化を検討する場合:

を:

{ 
    "Users" : { 
    "7idb6ThWR8aqmnEHFao5GRCV1kI3" : { 
     "dPicture" : "https://firebasestorage.googleapis.com/v0/b/parkir-ngasal.appspot.com/o/Profile_images%2Fcropped1465266876.jpg?alt=media&token=44f83fdf-935a-4b3c-8138-561dcba2fca7", 
     "status" : "hi my name is erik", 
     "uid" : "7idb6ThWR8aqmnEHFao5GRCV1kI3", 
     "username" : "erik" 
    } 
    }, 
    "posts" : { 
    "7idb6ThWR8aqmnEHFao5GRCV1kI3": { 
     "-KfsrGsY8TWb2wiMFtAq" : { 
     "dPicture" : "https://firebasestorage.googleapis.com/v0/b/parkir-ngasal.appspot.com/o/Profile_images%2Fcropped1465266876.jpg?alt=media&token=44f83fdf-935a-4b3c-8138-561dcba2fca7", 
     "image" : "https://firebasestorage.googleapis.com/v0/b/parkir-ngasal.appspot.com/o/Post_Images%2Fcropped1354055061.jpg?alt=media&token=77fbc9ed-4356-43c1-b7bb-9563300a8b7b", 
     "small_title" : "tes", 
     "summary" : "tes", 
     "title" : "tes", 
     "username" : "erik" 
     } 
    } 
    } 
} 

この構造により、あなたはより速く構築/はるかに簡単で、ユーザーのためのポストを得ることができます

mThisUsersPosts = mDatabasePosts.child(mCurrentUser); 

mThisUsersPosts.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for (DataSnapshot child: dataSnapshot.getChildren()) { 
      System.out.println(child.getKey()); 
      System.out.println(child.child("title").getValue()); 
     } 
    } 
+0

これはまさに私が必要とするものです。 私は希望の結果を達成しましたが、イベントします。はい、あなたの提案は良い方法です(私は2回upvoteすることができれば)。どのように私は "投稿"キーとして設定するユーザーのUIDを渡すのですか? – Jagmaster

0

は何をする必要があると、これはある

for(Datasnapshot data : datasnapshot.getChildren()){ 
    Post post = data.getValue(Posts.class); 
    } 

そこからあなたが必要なものを得ることができます。これはFirebaseの素晴らしい点です。それはあなたのためにあなたのモデルを構築するということです。だから、posts.getPostTile()posts.getPostSummary()のようなことをすることができます。それは本当に便利です。あなたが必要なもの

+0

こんにちはBlackHatSamurai ...答えに感謝します。ポストクラスは何か分かりません。そのクラスを作成する必要がありますか? Firebaseデータベースからデータを取得しようとしていますが、これは私の質問に投稿されたJsonに表示されています(私は非常にシンプルだと思っています。 AndroidプログラミングとFirebase hehe) – Jagmaster

+0

@Jagmasterあなたが取得しようとしているデータ型のクラス。例としてPostsを使用しました。どのような種類のデータが格納されているのか、それはあなたがそこに置いたものです。 – BlackHatSamurai

4

あなたはFirebaseデータベースに対してクエリを実行すると

for(Datasnapshot snap : datasnapshot.getChildren()){ 
    String key = snap.getKey(); 
    Post post =snap.getValue(Post.class); 
    } 

おかげで

+0

こんにちは@ Mohom.R答えてくれてありがとう...答えとしてあなたの答えを受け入れることができないので、彼は答えとして私の状況を使用しているのでフランク・ヴァン・プフレンの答えはより関連性が高いですが、間違いなく私は何をすべきですか私はこれをupvoteします! – Jagmaster

関連する問題