首页 文章

如何编写Firebase查询来过滤掉数据?

提问于
浏览
1

我想编写一个查询,以便使用edittext过滤数据,下面的代码确实有效,但带来了所有不需要的搜索数据 . 你能帮我么? JSON对象如下:我想要过滤的数据是用户名

firebase json object

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());
        }
    };

}
}

2 回答

  • 1

    为了解决这个问题,我们需要了解Firebase的一些内容,许多开发人员可能会忽略这些内容 .

    • 这是一个基于NoSQL的数据存储,因此您必须相应地构建数据 .

    • Firebase允许您将节点嵌套到数据结构中,最多可达32级,这很容易被滥用 .

    我认为你手边的问题是“有一个 EditText ,允许用户搜索 usersusernames .

    我建议你解决这个问题的方法是扁平化数据结构

    enter image description here
    您可以在 usernames 数组中包含对象 . 每个对象的键是 username ,值是另一个具有 empty-key : "" 的对象 .

    然后你可以拥有另一个 users 数组,其中键也是 usernames ,其余的数据作为它下面的对象存在 .

    现在,您可以轻松地在 usernames 上运行筛选查询,而无需担心在该查询中获取不必要数据的开销 .

    一旦你知道选择了哪个 username ,你就可以查询 users 从数组中获取那个确切的 user .

  • 0

    查询query = databaseReference.orderByChild(“username”) . startAt(search).endAt(search“〜”) . limitToFirst(10);

相关问题