通过数据库快照检索孩子列表

通过查询检索子节点有点麻烦。

这是我的数据结构:

http://img1.mukewang.com/62b4369e00015a9705480250.jpg

我设法能够使用上图中突出显示的“1”节点成功查询和检索数据。这是我的代码:


databaseRecipes = FirebaseDatabase.getInstance().getReference().child("recipe");


Query query = databaseRecipes.orderByChild(userId).equalTo(true);


query.addListenerForSingleValueEvent(new ValueEventListener()

    {

        @Override

        public void onDataChange(DataSnapshot dataSnapshot)

        {

            if(dataSnapshot.exists())

            {

                Toast.makeText(getApplicationContext(), "Results found!", Toast.LENGTH_LONG).show();


                arrayList.clear();

                for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren())

                {

                    Recipe recipe = dataSnapshot1.getValue(Recipe.class);

                    arrayList.add(recipe);

                }


                final RecipeAdapter recipeAdapter = new RecipeAdapter(getApplicationContext(), arrayList);

                recyclerView.setAdapter(recipeAdapter);

                recipeAdapter.notifyDataSetChanged();

            }

            else

            {

               // Toast.makeText(getApplicationContext(), "No retreivable results :(", Toast.LENGTH_LONG).show();

                Toast.makeText(getApplicationContext(), userId, Toast.LENGTH_LONG).show();

            }

        }

但是,我宁愿将所有“收藏夹”放在它们自己的单独节点下,如用“2”突出显示的那样。(那里只有一个孩子用于测试目的,实际上会节省更多,所以这样做会更整洁。)


使用此代码:


Query query = databaseRecipes.child("favourite").orderByChild(userId).equalTo(true);

我还尝试将引用更改为:


databaseRecipes = FirebaseDatabase.getInstance().getReference().child("recipe").child("favourite");

并查询:


Query query = databaseRecipes.orderByChild(userId).equalTo(true);

但无论哪种方式都不会检索到任何结果。我认为我的问题是从以下方面要求孩子DataSnapshot:


for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) 

但是我整天都在兜圈子,试图找到一个替代方案(我想我错过了一些非常简单的东西——这更烦人!),所以任何帮助都将不胜感激。


提前为我糟糕的绘画技巧道歉!


慕标5832272
浏览 125回答 1
1回答

慕工程0101907

当您使用以下查询时:Query query = databaseRecipes.orderByChild(userId).equalTo(true);一切正常,因为您uid是对象中的一个属性-LY18 ... hFqO。以下查询:Query query = databaseRecipes.child("favourite").orderByChild(userId).equalTo(true);由于您缺少一个孩子,这是实际推送的 id ,因此将无法工作-LY18 ... hFqO。我认为您正在寻找可能如下所示的查询:databaseRecipes.child($uid).child("favourite").orderByChild(userId).equalTo(true);但不幸的是,Firebase 中没有通配符。因此,您无法根据地图中存在的属性过滤项目。这在 Cloud Firestore 中实际上是可能的,但关于您的用例,您应该考虑通过创建另一个名为的节点来扩充您的数据结构以允许反向查找favoriteUsers,您应该在其中添加所有喜爱的用户recipes。这种做法称为denormalizationFirebase 的常见做法。如果您是 NoQSL 数据库的新手,我建议您观看此视频,为了更好地理解Firebase 数据库的非规范化是正常的。此外,当您复制数据时,需要记住一件事。与添加数据的方式相同,您需要对其进行维护。换句话说,如果你想更新/删除一个项目,你需要在它存在的每个地方都这样做。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java