gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 23:19:11 26 4
gpt4 key购买 nike

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

这是我的数据结构:

Firebase Structure

我已经设法使用上图中突出显示的“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();
}
}

不过,我宁愿将所有“Collection 夹”放在各自单独的节点下,如突出显示的“2”所示。 (那里只有一个 child 用于测试目的,实际上会节省更多,所以这样做会更整洁。)

使用这段代码:

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 中请求 child :

for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) 

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

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

编辑

如果有其他人从 SQL 背景中遇到这个 Firebase 的新手,Alex 给出了可靠的建议。

新节点创建:

New Data Structure

查询节点的代码 -

数据库引用:

databaseFvourites = FirebaseDatabase.getInstance().getReference().child("favouriteRecipes").child(userId);

查询:

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

数据结构可能还可以进一步改进,但就我的需要而言,它做得很好。

最佳答案

当您使用以下查询时:

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

一切正常,因为您的 uid 是您的 -LY18 ... hFqO 对象中的一个属性。

以下查询:

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

不会工作,因为你缺少一个 child ,这是实际推送的 id -LY18 ... hFqO

我认为您正在寻找可能如下所示的查询:

databaseRecipes.child($uid).child("favourite").orderByChild(userId).equalTo(true);

但不幸的是,Firebase 中没有通配符。因此,您不能根据 map 中存在的属性来过滤项目。这在 Cloud Firestore 中实际上是可能的,但关于您的用例,您应该考虑通过创建另一个名为 favoriteUsers 的节点来扩充数据结构以允许反向查找,您应该在其中添加所有最喜欢的用户 食谱。这种做法称为 非规范化,是 Firebase 的常见做法。如果您是 NoQSL 数据库的新手,我建议您观看此视频,Denormalization is normal with the Firebase Database以便更好地理解。

此外,当您复制数据时,需要牢记一件事。以与添加数据相同的方式,您需要维护它。换句话说,如果你想更新/删除一个项目,你需要在它存在的每个地方进行。

关于java - 通过数据库快照检索子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54726285/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com