我正在构建一个应为您创建电影库的应用程序。我已经设置了Firebase数据库,以将电影标题和所有电影规范存储在数据库中,例如:
我要采取的下一步是仅读取电影标题(“官方机密”,“塞伯格”,“坚不可摧的金米·施密特”),以向用户显示电影标题的列表。我尝试使用
void readData()
{
DBRef.once().then((DataSnapshot datasnapshot){
print('DATA SNAPSHOT NEXT LINE');
print(datasnapshot.value);
});
}
但是,当我只想要标题时,便会在我的Firebase数据库中获取所有数据。如何只抓标题?然后,如果用户选择了一个标题,那么我想进入数据库并获取该标题下的所有信息。例如:
我也尝试过:
void readData()
{
DBRef.child('Official Secrets (2019)').once().then((DataSnapshot datasnapshot)
{
print('DATA SNAPSHOT NEXT LINE');
print(datasnapshot.value);
});
}
我用它来尝试测试仅抓取电影的标题,但这返回null。
答案 0 :(得分:1)
不幸的是,简单的答案是你做不到。不适用于当前架构。由于RTDB中数据的组织方式,因此无法不提取整个节点的子数据而仅提取电影标题。
您现在必须做的事情称为数据展平,即避免深度嵌套以避免获取节点的全部数据。 guide的结构化数据可能会有所帮助。
您可以创建一个名为movie_titles
的附加节点,并将所有电影标题保留在那里,并保持reel-house
节点不变。
现在,您始终总是在开始时获取movie_titles
节点而没有获取所有数据并在应用程序中显示标题。当用户点击应用中的特定标题时,然后从reel-house
节点中获取相应的数据。
您的数据库可能看起来像这样
movie_titles:[
"title 1",
"title 2",
"title 3",
"title 4",
],
reel-house: [
"title 1": {
// data for title 1
},
"title 2": {
// data for title 2
},
"title 3": {
// data for title 3
},
"title 4": {
// data for title 4
},
],
答案 1 :(得分:1)
您必须执行以下操作。但是你的数据结构不好
List<String> readData()
{
List<String> titleList = new List()
Map<String,String> map = new Map();
DBRef.once().then((DataSnapshot datasnapshot){
print('DATA SNAPSHOT NEXT LINE');
print(datasnapshot.value);
map = datasnapshot.value();
map.forEach((key,value){
map.add(key);
continue;
})
});
return titleList;
}