如何从Firebase数据库中检索数据,DataSnapShot返回空值和键

时间:2018-03-18 18:03:11

标签: java android firebase firebase-realtime-database

我正在努力将Firebase实时数据库应用到我的应用程序,问题是DataSnapShot检索空键和值。

我已经尝试过查看文档,但我不知道出了什么问题。

数据库结构:

Database Structure

我的代码:

private DatabaseReference mUserDatabase;

public NetworkRepository(){
    mUserDatabase = FirebaseDatabase.getInstance().getReference();
}

public void getFoodFromFirebase(String query){

    Query searchQuery = mUserDatabase.orderByChild("Food Name").startAt(query).endAt(query + "\\uf8ff");

    searchQuery.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            String value = dataSnapshot.getValue(String.class);
            Log.d("Value is: ", value);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

上下文

我正在使用搜索查询,它将返回数据库中的所有项目。理想情况下,如果用户键入“应用程序”,它将返回包含' App'在食物名称。

那么如何将这些数据作为List检索?我确实有一个模型,但如果有人能指出我正确的方向,我将不胜感激。

编辑:

运行此代码时:

Query searchQuery = fitnessTrackerRef.orderByChild("foodName");

它将检索所有项目(应该如此),但是当我添加要搜索的查询时,它将返回一个空值。这是下面的代码和两张结果图片。

Query searchQuery = fitnessTrackerRef.orderByChild("foodName").startAt(query).endAt(query + "\\uf8ff");

Without query string

With query string

如图所示,添加查询时不会返回任何数据。我的searchQuery语法不正确吗?

1 个答案:

答案 0 :(得分:0)

这是如何创建食物名称列表的:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference itemsRef = rootRef.child("items");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<String> list = new ArrayList<>();
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String foodName = ds.child("Food Name").getValue(String.class);
            list.add(foodName);
        }
        Log.d("TAG", list);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
itemsRef.addListenerForSingleValueEvent(valueEventListener);