Android 如何编写Firebase查询以过滤数据?
我想编写一个查询,以便使用edittext筛选数据,下面的代码可以工作,但会带来所有不需要的搜索数据。你能帮帮我吗?JSON对象如下:我想过滤掉的数据是用户名Android 如何编写Firebase查询以过滤数据?,android,firebase,firebase-realtime-database,firebaseui,Android,Firebase,Firebase Realtime Database,Firebaseui,我想编写一个查询,以便使用edittext筛选数据,下面的代码可以工作,但会带来所有不需要的搜索数据。你能帮帮我吗?JSON对象如下:我想过滤掉的数据是用户名 public class SearchActivity extends AppCompatActivity { ListView searchList; DatabaseReference databaseReference; FirebaseListAdapter<SearchDetails> listAdapter; S
public class SearchActivity extends AppCompatActivity {
ListView searchList;
DatabaseReference databaseReference;
FirebaseListAdapter<SearchDetails> listAdapter;
String search;
EditText editTextSearch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
searchList = (ListView) findViewById(R.id.listViewSearch);
databaseReference = FirebaseDatabase.getInstance().getReference().child("Search Users");
editTextSearch = (EditText) findViewById(R.id.editTextSearch);
editTextSearch.addTextChangedListener(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) {
}
@Override
public void afterTextChanged(Editable s) {
search = editTextSearch.getText().toString();
if (search.equals("")){
searchList.setAdapter(null);
}else{
searchList.setAdapter(listAdapter);
}
}
});
Query query = databaseReference.startAt(search).endAt(search+"~").limitToFirst(10);
listAdapter = new FirebaseListAdapter<SearchDetails>(
this,
SearchDetails.class,
R.layout.search_layout,
query
) {
@Override
protected void populateView(View v, SearchDetails model, int position) {
TextView username = (TextView) v.findViewById(R.id.textViewUsername);
username.setText(model.getUsername());
TextView name = (TextView) v.findViewById(R.id.textViewName);
name.setText(model.getName());
}
};
}
}
公共类SearchActivity扩展了AppCompatActivity{
列表视图搜索列表;
数据库参考数据库参考;
FirebaseListAdapter;
字符串搜索;
编辑文本编辑文本搜索;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u search);
searchList=(ListView)findViewById(R.id.listViewSearch);
databaseReference=FirebaseDatabase.getInstance().getReference().child(“搜索用户”);
editTextSearch=(EditText)findViewById(R.id.editTextSearch);
editTextSearch.addTextChangedListener(新的TextWatcher(){
@凌驾
更改前文本之前的公共void(字符序列s、int start、int count、int after){
}
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
}
@凌驾
公共无效后文本已更改(可编辑){
search=editTextSearch.getText().toString();
if(search.equals(“”){
searchList.setAdapter(null);
}否则{
searchList.setAdapter(listAdapter);
}
}
});
Query Query=databaseReference.startAt(search).endAt(search+“~”).limitToFirst(10);
listAdapter=新的FirebaseListAdapter(
这
SearchDetails.class,
R.layout.search_布局,
查询
) {
@凌驾
受保护的void populateView(视图v、SearchDetails模型、int位置){
TextView用户名=(TextView)v.findViewById(R.id.textViewUsername);
username.setText(model.getUsername());
TextView名称=(TextView)v.findViewById(R.id.textViewName);
name.setText(model.getName());
}
};
}
}
Query Query=databaseReference.orderByChild(“用户名”).startAt(搜索).endAt(搜索+“~”).limitToFirst(10) 为了解决这个问题,我们需要了解有关Firebase的一些事情,很多开发人员可能会忽略这些事情
- 它是基于NoSQL的数据存储,因此您必须相应地构造数据
- Firebase允许您在数据结构中嵌套多达32层的节点,这很容易被滥用
EditText
,允许用户搜索您的用户的用户名
我建议您如何解决这一问题,就是将数据的结构扁平化,就像这样
您可以在用户名
数组中包含对象。每个对象的键是用户名
,值是另一个具有空键的对象:“
类似于此
然后,您可以拥有另一个用户数组
,其中键是用户名
,其余数据作为一个对象存在于其下
现在,您可以轻松地在用户名上运行筛选查询,而不必担心在该查询中获取不必要数据的开销
一旦你知道选择了哪个用户名
,你就可以查询用户
,从数组中获取准确的用户
。你能具体说明一下,你想获取什么数据吗?这个问题对我来说不是很清楚。我只想过滤掉用户名Hey@Jama我在下面为你添加了一个答案,如果是帮助和/或您想了解更多信息。很抱歉,它不起作用,它带来了所有不需要的数据