Android 没有得到Firebase查询中应该给出的确切结果
在文本中,watcher是这样查询的,但是当任何用户更改数据时,它都找不到新更改的数据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
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");
}
} ;