【问题标题】:Search value in firebase realtime on button click点击按钮时在firebase中实时搜索值
【发布时间】:2020-04-07 11:47:46
【问题描述】:

我一直在寻找如何做到这一点,大多数答案都是通过过滤单词来搜索的。我想要的是搜索按钮单击并在下一个活动中显示结果。这就是我的搜索的样子:

这是我的代码:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search_student;

    mbutton = (Button) findViewById(R.id.search_button);
    search = (EditText) findViewById(R.id.input_search);


    mbutton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mDbref = FirebaseDatabase.getInstance().getReference();
            mchildref = mDbref.child("Students");
            Query query = mchildref.orderByChild("Name").equalTo(search);

            mchildref.child("Students").addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    String value =dataSnapshot.getValue(String.class);
                    Intent search= new Intent(SearchStudentActivity.this, testing.class);
                    startActivity(search);

                }

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

                }
            });

希望向你们学习,谢谢。

【问题讨论】:

  • 请发布您要搜索的内容。是特定的字段数据还是什么?
  • 实时就是即时更新数据,你最好用Firestore
  • 你的代码有什么问题?
  • @Ashish 查找输入字段中的字符串。
  • @JamaldinSabirjanov 当我点击搜索时,它给了我空白页。

标签: android firebase search firebase-realtime-database


【解决方案1】:
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search_student;

    mbutton = (Button) findViewById(R.id.search_button);
    search = (EditText) findViewById(R.id.input_search);
    //Add a TextView here to set the text (optional, depends on how you want to show the retrieved data)
    String lastName;

    mbutton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

        final String studentToSearch = search.getText().toString();

        myDbref = FirebaseDatabase.getInstance().getReference().child("Students").child(studentToSearch);
        myDbref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            try {
                lastName = dataSnapshot.child("last name").getValue().toString();
                lastNameTextView.setText(lastName);
            }catch (Throwable e){
                Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
            }
        }

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

        }
    });

请尝试这种方式。在这里,我假设您在父节点中有一个名为“姓氏”的子节点,例如Students >> studentToSearch >> last name。 只需替换任何内容而不是姓氏即可获取其他信息。

【讨论】:

  • 是的,谢谢,我还添加了 addListenerForSingleValueEvent
  • @SarahMiller 很高兴听到它对您有用。如果您认为这是正确的答案,请单击 TICK 图标接受它作为答案,如果您喜欢它,请点赞。谢谢
【解决方案2】:

一种将您的addListenerForSingleValueEvent 替换为ValueEventListener 的解决方案。

ValueEventListener 附加到数据列表会将整个数据列表作为单个数据快照返回,然后您可以循环访问单个子数据。

        Query query = mchildref.orderByChild("Name").equalTo(search);

        query.addValueEventListener(new ValueEventListener() {
          @Override
          public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {
              // TODO: handle the post, extract the values to pass to another activity
            }

            String value =dataSnapshot.getValue(String.class);
            Intent search= new Intent(SearchStudentActivity.this, testing.class);
            startActivity(search);
          }

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

          }
        });

//        mchildref.child("Students").addListenerForSingleValueEvent(new ValueEventListener() {
//          @Override
//          public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
//            String value =dataSnapshot.getValue(String.class);
//            Intent search= new Intent(SearchStudentActivity.this, testing.class);
//            startActivity(search);
//
//          }

【讨论】:

    猜你喜欢
    • 2022-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多