2016-12-01 3 views
0

Firebase AndroidでSQL IN句をクエリするにはどうすればよいですか? Firebase Recyclerアダプタで使用して、何らかの状態に基づいて一部の子のみを取得したいと考えています。次の文のようなもの:Firebase AndroidでSQL IN句を実行する方法

SQL----> select * from posts where city in(10 cities comes here) 

Firebase Recyclerアダプタで使用するにはFirebaseクエリが必要です。

答えて

1

Firebaseデータベースは、SQLのWHERE id IN (1,2,3)と同等のものを持っていません。 IDで選択する場合、Firebaseのアイテム検索方法は、Firebase pipelines the requestsであるため同等です。

IDで選択していないため、あなたのケースは異なります。残念ながら、Firebaseデータベースのクエリにクエリを直接マッピングする方法はありません。代わりにFirebaseのNoSQLのデータベースを作成しようとしているの

は、私は非常には、NoSQLのデータベースとのより良いフィットするものにあなたのデータモデルをマッピングし始めることをお勧めします、SQLトリックを行います。このプロセスを開始するには、NoSQL data modelingのこの記事とFirebase for SQL developersの新しいビデオシリーズがあります。我々はFirebaseRecyclerAdapterを使用することはできません。

また、私は解決策を見つけたFirebase complex "contain" queries

+0

?私たちは完全に10の記事を持っていると仮定しよう。私たちはいくつかのユーザーの投稿だけを取得したいと思っています.....例えば、Facebookの友達は私たちの友達の投稿だけを取得します。私の大学プロジェクトをfirebaseを使ってやっています....それはFacebookのようなアプリです...友人にリクエストを送る...タイムラインで投稿を見るなど –

+0

[ユーザー投票を表示する必要がある問題]に対する解決策(https://stackoverflow.com/questions/45865924/firebase-getting-around-joins-example-display-star-count-for-each-user)各商品の投票ごとにリクエストを実行するだけですか?私はリクエストが並行して実行されていることを知っています。クラウド機能ですべてのことを行うことで往復を救うことができますが、それでも無駄なことはありません。 – Ced

1

を参照してください。代わりに、RecyclerView.ViewHolderを拡張するカスタムアダプタを作成する必要があります。

このアダプタに値を渡すために、まず私たちはaddValueEventListenerを使用してデータを取得する必要があり、その後、私たちは、アダプタに値を渡す必要があります。我々はIDを使用して選択しているとき、何をすべきか

これは私のコードです...

final ArrayList<Timeline> timelines = new ArrayList<>(); 

    mDatabaseTimeline.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 

      final Timeline timeline = dataSnapshot.getValue(Timeline.class); 

      if(timeline != null){ 

       mDatabaseFriends.child(mAuth.getCurrentUser().getUid()).child("active").addListenerForSingleValueEvent(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 

         if (mAuth.getCurrentUser().getUid().equals(timeline.getUid()) || dataSnapshot.hasChild(timeline.getUid())) { 

          timelines.add(timeline); 
          mTimelineRecycler.setAdapter(new RecyclerAdapter(TimelineFragment.this.getContext(), timelines)); 

         } 
        } 

        @Override 
        public void onCancelled(DatabaseError databaseError) { 

        } 
       }); 
      } 
     } 

     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 

     } 

     @Override 
     public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

アダプター----->

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    Context context; 
    ArrayList<Timeline> timeline; 


    public RecyclerAdapter(Context context, ArrayList<Timeline> timeline) { 
     this.context = context; 
     this.timeline = timeline; 



    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     LayoutInflater inflater = LayoutInflater.from(context); 
     View row = inflater.inflate(R.layout.timeline_row, parent, false); 
     TimelineViewHolder holder = new TimelineViewHolder(row); 
     return holder; 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 


     final String post_key = timeline.get(position).getPostkey(); 

     ((TimelineViewHolder) holder).setUsername(timeline.get(position).getUsername()); 


} 

    @Override 
    public int getItemCount() { 
     return timeline.size(); 
    } 

    public class TimelineViewHolder extends RecyclerView.ViewHolder { 
     public TimelineViewHolder(View itemView) { 
      super(itemView); 

      view = itemView; 
     } 

     public View getView() { 
      return view; 
     }  

     public void setUsername(String username) { 
      TextView usernameTxtView = (TextView) view.findViewById(R.id.timeline_username); 
      usernameTxtView.setText(username); 
     } 

    } 
} 
+0

解決策を見つけたと聞いて嬉しいです。コードを共有してくれてありがとう! –

関連する問題