web-dev-qa-db-ja.com

Firebaseからデータを取得し、プルを実行して更新してより多くの機能をロードする

まだ今、FireBaseから一度にすべてのデータを取得しています。データを取得するために実行したいこと[〜#〜]制限[〜#〜]一度に15レコードのように。初めての場合と同様に、ユーザーはFirebaseから15レコードを取得し、ユーザーが画面の下部/上部でより多くのデータをロードする場合、Firebaseから15より多くのレコードを取得して下部に追加する必要があります/リストのTOP。

以下のように、Firebaseからデータベースの上部ORデータベースの下部に15レコードを取得するロジックを実装しました:-

public class ChatActivity extends AppCompatActivity implements FirebaseAuth.AuthStateListener {

    private FirebaseAuth mAuth;
    private DatabaseReference mChatRef;

    private Query postQuery;
    private String newestPostId;
    private String oldestPostId;
    private int startAt = 0;
    private SwipeRefreshLayout swipeRefreshLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat);

        mAuth = FirebaseAuth.getInstance();
        mAuth.addAuthStateListener(this);

        mChatRef = FirebaseDatabase.getInstance().getReference();
        mChatRef = mChatRef.child("chats");

         /////GETTING THE VIEW ID OF SWIPE LAYOUT
        swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);

    /////GETTING FIRST 10 RECORDS FROM THE FIREBASE HERE
        mChatRef.limitToFirst(10).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot child : dataSnapshot.getChildren()) {
                    oldestPostId = child.getKey();
                    System.out.println("here si the data==>>" + child.getKey());
                }      
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

        //////FOR THE PULL TO REFRESH CODE IS HERE
       swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                // Refresh items  

             System.out.println("Here==>>> "+oldestPostId);

                ///HERE "oldestPostId" IS THE KEY WHICH I GET THE LAST RECORDS FROM THE FIREBASE

                mChatRef.startAt(oldestPostId).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot child : dataSnapshot.getChildren()) {

                    System.out.println("here AFTER data added==>>" + child.getKey());
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

            }
        });
    }

私はここでSOで検索しましたが、期待した結果が得られませんでした。検索したリンクの下にあります

1。 最初のリンク
2。 2番目のリンク
3。 番目のリンク
4。 4番目のリンク

画像で私のfirebaseデータ構造を見てください。
Data of firebase

私は最初に15 OR 10レコードを取得するためのロジックを実装しましたが、それは機能します。また、制限内でより多くのレコードをロードするためのロジックを実装しましたが、適切な解決策が得られない(動作していない)、助けて私がどこで間違っているのか教えてください..ありがとう:)

ソリューションを編集

:-私はこのリンクに機能をロードするか、プルして機能を更新します:- Firebase無限スクロールリストビュースクロール時に10項目をロード

11

orderByKey()がありません。フィルタリングクエリでは、順序付け関数を使用する必要があります。 ドキュメント を参照してください

onRefreshメソッドで制限を設定する必要があります:

 public void onRefresh() {
     // Refresh items  
     ///HERE "oldestPostId" IS THE KEY WHICH I GET THE LAST RECORDS FROM THE FIREBASE
                mChatRef.orderByKey().startAt(oldestPostId).limitToFirst(10).addListenerForSingleValueEvent(new ValueEventListener() {
.....

したがって、取得したデータは、最初の10レコードを取得した後の唯一の10個の新しいレコードです。

新しく取得したデータの最も古いキーを保存して、次回の更新時にこのキーから新しいデータのみが取得されるようにしてください。

提案:最後のキーを見つけるために子の値リスナーを追加する代わりに、値リスナーを使用して、次のサイズの最後のデータスナップショットを取得できます。最後のレコードのキーを取得します。

9
kirtan403

データベースを再構築し、0、1、2、3などのように増分される新しい子IDを設定します。

"chats": {
"-KZLKDF": {
  "id": 0,
  "message": "Hi",
  "name":"username"
},

次に、クエリのメソッドを作成します

public void loadFromFirebase(int startValue,int endValue){

mChatRef.orderByChild(id).startAt(startValue).endAt(endValue).addListenerForSingleValueEvent(this);
}

addListenerForSingleValueEventが実装されていることを確認してから、アダプター関連のタスクを実行します。最初にonCreateメソッドから呼び出します。

loadFromFirebase(0,10);

注意:リストに新しいコンテンツをロードする場合は、アダプターに注意する必要があります。

3
Milon