【问题标题】:Firebase Database Search DataFirebase 数据库搜索数据
【发布时间】:2018-04-03 20:47:50
【问题描述】:

所以我想了几天,但似乎没有得到正确的答案。我有一个 Firebase 数据库,我想在一个孩子中搜索数据。现在,我在这里看到了很多很好的例子。我知道如何搜索特定数据:

                mDatabaseReference.orderByChild("Time").equalTo("10:00").
                        addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                for (DataSnapshot userSnapshot: dataSnapshot.getChildren()){
                                    System.out.println(userSnapshot.getKey());
                                    System.out.println(userSnapshot.child("time").getValue(String.class));
                                }
                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {
                                    throw databaseError.toException();
                            }
                        });

在上面的示例中,我可以在我的子数据库中搜索"10:00"。效果很好,我有这个例子来自这里“Search in firebase database for android?”。 问题是,我有一个时间选择器。时间选择器数据存储在 textView 中。像这样:

 pickTimeTextView = findViewById(R.id.timePickTextView);

在时间选择器的 Onclick 上:

 pickTimeTextView.setText("");

在 OnTimeSet 上:

 pickTimeTextView.setText(String.format(getString(R.string.hour_selected) + "%02d:%02d", hourOfDay, minute));

我的问题是我是否有机会使用 textView 的内容搜索我的 firebase 数据库? textView 中的字符串将随着我在时间选择器中选择的时间而变化。 你们认为我可以用firebase做到这一点吗?如果没有,你能指出我正确的方向吗?提前谢谢!


稍后编辑:

我把查询放在 OnTimeSetListner 中(没有格式就不行):

@Override
public void onTimeSet(TimePickerDialog view, int hourOfDay, int minute, int second) {
    pickTimeTextView.setText(String.format(getString(R.string.hour_selected) + "%02d:%02d", hourOfDay, minute));

    String hours = (hourOfDay < 10) ? "0" + hourOfDay : hourOfDay;

    mDatabaseReference.orderByChild("users").equalTo(hourOfDay + minute).
            addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot userSnapshot: dataSnapshot.getChildren()){
                        System.out.println(userSnapshot.getKey());
                        System.out.println(userSnapshot.child("users").getValue(String.class));
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    throw databaseError.toException();
                }
            });

}

我尝试按照 cutiko 的指示格式化小时和分钟参数,但是当我这样做时,我得到了这个错误:

不兼容的类型。 必需的: java.lang.String 成立: java.io.Serializable & java.lang.Comparable

我再次阅读了我写的内容,但我并没有尽我所能解释问题。 我想在 firebase db 中搜索以查看是否已存储所选(用户的时间)。如果是,则向用户发送错误。我使用时间选择器来选择时间,时间选择器受到限制,只显示上午 8 点到 11 点之间的时间。

【问题讨论】:

  • 我刚刚给了你一个答案,但我越读越困惑。我已经用时间设置了 TextView,那么你正在使用日期选择器的时间侦听器,那么为什么在选择时间时不再次运行查询呢?这里还有其他问题吗?

标签: android firebase firebase-realtime-database


【解决方案1】:

TimePickers 有一个时间选择的侦听器。选择时间后,再次运行查询。 我能看到的唯一问题是,计时器选择的侦听器的小时和分钟参数小于十个个位数,因此您必须对其进行格式化;

//First you have to concatenate the argument you are looking to query

String hours = (h < 10) ? "0"+h : String.valueOf(h);
Stting minutes = (m < 10) ? "0"+h : String.valueOf(m);

//Your harcoded argument is like this "hh:mm"
//so we have to concatenate a String like that
String argument = hours + ":" minutes;

//Then pass the argument to the query
mDatabaseReference.orderByChild("users").equalTo(argument)...

文档对参数、小时和分钟有很好的解释 https://developer.android.com/reference/android/widget/TimePicker.OnTimeChangedListener.html

【讨论】:

  • 我明白了你的意思,我再次运行查询 onTimeSet (没有你给我的那段代码)它不起作用,即使已经添加了那个时间,它仍然在我的数据库中做广告。使用您给我的代码,它给了我一个错误:不兼容的类型。必需:java.lang.String 找到:java.io.Serializable & java.lang.Comparable 。我会编辑我的帖子并贴出那段代码,也许我做错了什么......
  • 特地写了一个关于分钟的评论来减少你的问题,但你似乎选择忽略它
  • 老兄,不管有没有,我仍然有错误!我编辑告诉你我得到了一个错误,如果我做分钟,我现在有两个错误......
  • @Dean 再试一次,我认为错误是 int 没有转换为 String
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-25
  • 2017-04-25
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多