2017-05-31 10 views
1

Firebase Databaseのすべてのキー内のデータを読み込むようにします。Firebaseデータベースから特定のキーを除くすべてのキーのすべてのデータを読み取るにはどうすればよいですか?

ここに私のデータベース snapshot of my Databaseのスナップショットがあります。

app_nameの下にあるキーはユーザーを表し、ユーザーキー内のすべてのキーにはデータが含まれています。そのようなユーザーキーの中からデータを読み取ることができるようにする必要があります(追加するデータ以外のすべてのデータを読み取る場合と同じように)。私は明らかにすべてのユーザーの鍵を知らず、そのリストは後で拡張または最小化することができます。 FirebaseDatabase.getInstance.getReference.child(string)を使用して私がアクセスできる唯一のレベルは、アプリ名の下にあります。各ユーザーキー内のキー内のデータを読み取ってコンテンツをの形式で表示する方法がありますか?リストビューまたはリサイクラーアダプター

EDIT:

FirebaseRecyclerAdapter mAdapter; 
public FeedFragment() { 
    //empty constructor 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    mFirebaseDatabase = FirebaseDatabase.getInstance(); 
    mQuestionDatabaseReference = mFirebaseDatabase.getReference(); 

    // Inflate the layout for this fragment 
    View rootView = inflater.inflate(R.layout.fragment_feed, container, false); 

    RecyclerView recycler = (RecyclerView) rootView.findViewById(R.id.feed_view_list); 
    recycler.setHasFixedSize(false); 
    recycler.setLayoutManager(new LinearLayoutManager(getActivity())); 

    mAdapter = new FirebaseRecyclerAdapter<DataGetter, StatsViewHolder>(DataGetter.class, 0, StatsViewHolder.class, mQuestionDatabaseReference) { 
     @Override 
     public void populateViewHolder(FeedViewHolder viewHolder, DataGetter feedDisplay, int position) { 
      int layout = getItemViewType(position); 
      if (layout == R.layout.binary_feed) { 
       viewHolder.setQuestionTextBin(textDisplay.getQuestionText()); 
       viewHolder.setbOption1(textDisplay.getOption1()); 
       viewHolder.setbOption2(textDisplay.getOption2()); 
      } 
      else if (layout == R.layout.rating_feed) { 
       viewHolder.setQuestionTextRat(textDisplay.getQuestionText()); 
      } 
      else { 
       viewHolder.setQuestionTextMul(textDisplay.getQuestionText()); 
       viewHolder.setmOption1(textDisplay.getOption1()); 
       viewHolder.setmOption2(textDisplay.getOption2()); 
       viewHolder.setmOption3(textDisplay.getOption3()); 
       if (textDisplay.getNoOfOptions() >= 4) { 
        viewHolder.setmOption4(textDisplay.getOption4()); 
       } 
       if (textDisplay.getNoOfOptions() == 5) { 
        viewHolder.setmOption5(textDisplay.getOption5()); 
       } 
      } 
     } 

     @Override 
     public int getItemViewType(int position) 
     { 
      int view; 
      if(getItem(position).getQuestionType() == MainActivity.BINARY){ 
       view = R.layout.binary_feed; 
      } 
      else if(getItem(position).getQuestionType() == MainActivity.RATING) { 
       view = R.layout.rating_feed; 
      } 
      else //if(getItem(position).getQuestionType() == MainActivity.MULTIPLE) 
      { 
       view = R.layout.multiple_feed; 
      } 
      return view; 
     } 
    }; 
    recycler.setAdapter(mAdapter); 

    return rootView; 
} 

@Override 
public void onDestroy() 
{ 
    super.onDestroy(); 
    mAdapter.cleanup(); 
} 

が試み2:上記のコードで

FirebaseIndexRecyclerAdapter mAdapter; 

public FeedFragment() { 
    // empty constructor 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    mFirebaseDatabase = FirebaseDatabase.getInstance(); 
    mQuestionDatabaseReference = mFirebaseDatabase.getReference(); 

    // Inflate the layout for this fragment 
    View rootView = inflater.inflate(R.layout.fragment_feed, container, false); 

    RecyclerView recycler = (RecyclerView) rootView.findViewById(R.id.feed_view_list); 
    recycler.setHasFixedSize(false); 
    recycler.setLayoutManager(new LinearLayoutManager(getActivity())); 

    //attempt -> from Firebase documentation, loop over all data 
    final Query feedQuery = mQuestionDatabaseReference; 

    ArrayList<DataSnapshot> feedListData = new ArrayList<DataSnapshot>(); 

    feedQuery.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      int i = 0; 
      for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) { 
       ArrayList.add(postSnapshot); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      // Getting Post failed, log a message 
      Log.w(TAG, "loadPost:onCancelled", databaseError.toException()); 
      // ... 
     } 
    }); 

    mAdapter = new FirebaseIndexRecyclerAdapter<DataGetter, FeedViewHolder>(DataGetter.class, 0, FeedViewHolder.class, 
      feedQuery,mQuestionDatabaseReference) { 
      //remaining code is same as attempt 1 
    } 
+0

特定のノードをその値に基づいて除外する方法は、FirebaseデータベースAPIにはありません。 https://stackoverflow.com/a/39195551/209103 –

+0

ああ、大丈夫です。 @FrankvanPuffelenありがとうございました。しかし、最初の部分を達成するための方法はありますか?その質問で説明されているすべてのデータを読むことですか? –

+0

データベースの任意の場所から読み取ることができます。ですから、特定のユーザのための鍵が必要な場合は、 '/ app_home/$ uid'を読んでください。すべてのユーザを読むには、 '/ app_home'を読んでから、ユーザをループします。 https://firebase.google.com/docs/database/web/lists-of-data#listen_for_value_events –

答えて

0

ValueAddedListenerセットを追加ここでは、

public class FeedFragment extends Fragment { 

//Firebase instance variables 
private FirebaseDatabase mFirebaseDatabase; 
private DatabaseReference mQuestionDatabaseReference; 
private ChildEventListener mChildEventListener; 
private FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 

試み1を試みたものの一部でありますpostSnapshot内の値をKi-7Xtなどのキーに変更します。を繰り返し実行する別のループを追加するは必要な "内部データ"を与えます。

//a custom adapter extended from ArrayAdapter 
FeedAdapter feedAdapter; 
feedQuery.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      int i = 0; 
      for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) { 
       /*One way to exclude some data is to ignore it whenever it 
       *appears and take action for the others. The same approach 
       *has been taken here in the if condition*/ 
       if(postSnapshot.getKey().compareTo(user.getUid())!=0) { 
        //The inner loop to read data from the final desired location 
        for (DataSnapshot data : postSnapshot.getChildren()) { 
         DataGetter dataGetter = data.getValue(DataGetter.class); 
         //adding incoming data to adapter 
         feedAdapter.add(dataGetter); 
        } 
       } 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      //Getting values failed 
      Log.i(TAG, "loadPost:onCancelled", databaseError.toException()); 
      //... 
     } 
    }); 

ありがとう@FrankvanPuffelenは、あなたの最後の2コメントで説明しました。

関連する問題