Android 没有得到Firebase查询中应该给出的确切结果

Android 没有得到Firebase查询中应该给出的确切结果,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,在文本中,watcher是这样查询的,但是当任何用户更改数据时,它都找不到新更改的数据 TextWatcher tw = new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, i

在文本中,watcher是这样查询的,但是当任何用户更改数据时,它都找不到新更改的数据

TextWatcher tw = new TextWatcher() {

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        getSupportFragmentManager().beginTransaction().remove(searchMainFragment);
        quickResultsList.clear();
        quickResultsAdapter.notifyDataSetChanged();
        if(!s.toString().isEmpty()){
            Log.e(TAG, "onDataChange: "+ s.toString());
            Query query =  application.getMRef().child(getString(R.string.db_user_details)).orderByChild(getString(R.string.db_displayName))
                    .startAt(s.toString().toLowerCase().trim()).endAt(s.toString().toLowerCase().trim() +"\uf8ff");
                /* query.keepSynced(true); */
                query.addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                            for(DataSnapshot single : dataSnapshot.getChildren()){
                                quickResultsAdapter.add(single.child(getString(R.string.db_displayName)).getValue().toString());
                            }
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {

                        }
                    });

        }
    }

    @Override
    public void afterTextChanged(Editable s) {
        //application.getMRef().child(getString(R.string.db_user_details)).keepSynced(false);
        Log.e(TAG, "afterTextChanged: "+ " text has been changed");
    }
} ;
如果我使用keepsynced,它就会运行,但如果我不使用它,它就不起作用。我不想将这么多的数据同步到缓存中,我如何解决它?

当您使用addListenerForSingleValueEvent时,侦听器将精确读取数据一次。这意味着您的onDataChange将使用当前值从缓存(如果可用)调用,否则将从服务器调用,然后立即停止侦听


如果要继续侦听数据更改,应使用addValueEventListener。使用此选项意味着,与addListenerForSingleValueEvent一样,onDataChange会立即被当前数据调用,但与addListenerForSingleValueEvent不同的是,侦听器在此之后将保持活动状态,以后的更改也会被调用onDataChange。

最好在块外使用此选项

Query query =  application.getMRef().child(getString(R.string.db_user_details)).orderByChild(getString(R.string.db_displayName))
                .startAt(s.toString().toLowerCase().trim()).endAt(s.toString().toLowerCase().trim() +"\uf8ff");
            /* query.keepSynced(true); */
            query.addChildEventListener (new ChildEventListener() {

                    @Override
                    public void onChildAdded (@NonNull DataSnapshot dataSnapshot) {
                        for(DataSnapshot single : dataSnapshot.getChildren()){
                            quickResultsAdapter.add(single.child(getString(R.string.db_displayName)).getValue().toString());
                        }
                    }
                    @Override
                    public void onChildChanged(@NonNull DataSnapshot dataSnapshot) {
                        for(DataSnapshot single : dataSnapshot.getChildren()){
                            quickResultsAdapter.add(single.child(getString(R.string.db_displayName)).getValue().toString());
                        }
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {

                    }
                });
但这也会起作用

TextWatcher tw = new TextWatcher() {
boolean isMethodCalled = false;
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        getSupportFragmentManager().beginTransaction().remove(searchMainFragment);
        quickResultsList.clear();
        quickResultsAdapter.notifyDataSetChanged();
        if(!s.toString().isEmpty() && !isMethodCalled ){
            Log.e(TAG, "onDataChange: "+ s.toString());
               Query query =  application.getMRef().child(getString(R.string.db_user_details)).orderByChild(getString(R.string.db_displayName))
                .startAt(s.toString().toLowerCase().trim()).endAt(s.toString().toLowerCase().trim() +"\uf8ff");
            /* query.keepSynced(true); */
            query.addChildEventListener (new ChildEventListener() {

                    @Override
                    public void onChildAdded (@NonNull DataSnapshot dataSnapshot) {
                        for(DataSnapshot single : dataSnapshot.getChildren()){
                            quickResultsAdapter.add(single.child(getString(R.string.db_displayName)).getValue().toString());
                        }
                    }
                    @Override
                    public void onChildChanged(@NonNull DataSnapshot dataSnapshot) {
                        for(DataSnapshot single : dataSnapshot.getChildren()){
                            quickResultsAdapter.add(single.child(getString(R.string.db_displayName)).getValue().toString());
                        }
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {

                    }
                });
isMethodCalled  = true;

        }
    }

    @Override
    public void afterTextChanged(Editable s) {
        //application.getMRef().child(getString(R.string.db_user_details)).keepSynced(false);
        Log.e(TAG, "afterTextChanged: "+ " text has been changed");
    }
} ;

通过使用它,我得到了我的结果,它也是活动侦听器,所以我不需要担心同步过程

查询返回的大量数据有没有办法不将这些数据存储在缓存中,所以它总是调用服务器
TextWatcher tw = new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        getSupportFragmentManager().beginTransaction().remove(searchMainFragment);
        quickResultsList.clear();
        quickResultsAdapter.notifyDataSetChanged();
        if(!s.toString().isEmpty()){
            Log.e(TAG, "onDataChange: "+ s.toString());
            Query query =  application.getMRef().child(getString(R.string.db_user_details)).orderByChild(getString(R.string.db_displayName))
                    .startAt(s.toString().toLowerCase().trim()).endAt(s.toString().toLowerCase().trim() +"\uf8ff");
            query.addChildEventListener (new ChildEventListener() {

                @Override
                public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                    for(DataSnapshot single : dataSnapshot.getChildren()){
                        if(single.getKey().equals("displayName")){
                            Log.e(TAG, "onChildAdded: "+ single.getValue().toString());
                        }
                    }
                    //Log.e(TAG, "onChildAdded: "+ dataSnapshot);
                }

                @Override
                public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                    for(DataSnapshot single : dataSnapshot.getChildren()){
                        try {
                            if(single.getKey().equals("displayName")){
                                Log.e(TAG, "onChildChanged: "+ single.getValue().toString());
                            }
                        }catch (NullPointerException e){
                            e.printStackTrace();
                        }
                    }
                }

                @Override
                public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

                }

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

                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });

        }
    }

    @Override
    public void afterTextChanged(Editable s) {
        //application.getMRef().child(getString(R.string.db_user_details)).keepSynced(false);
        Log.e(TAG, "afterTextChanged: "+ " text has been changed");
    }
} ;