Java Android:如何优化从firebase获取数据?
我在firebase中创建了以下树结构。 现在在AndroidStudio中,我想从“en-US”的子节点(在本例中是节点1552040445614和1552040702223)获取数据 当我只需要键“id”和“text2”的值时,我用Java编写了一个数据模型类,如下所示:Java Android:如何优化从firebase获取数据?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我在firebase中创建了以下树结构。 现在在AndroidStudio中,我想从“en-US”的子节点(在本例中是节点1552040445614和1552040702223)获取数据 当我只需要键“id”和“text2”的值时,我用Java编写了一个数据模型类,如下所示: public class MyDataClass { public String id; public String text2; public MyDataClass() { } } ArrayL
public class MyDataClass {
public String id;
public String text2;
public MyDataClass() {
}
}
ArrayList<MyDataClass> listDataClass = new ArrayList<>();
mDatabase = FirebaseDatabase.getInstance().getReference().child("en-US");
mDatabase.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
MyDataClass myDataClass = datasnapshot.getValue(MyDataClass.class);
listDataClass.add(myDataClass);
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
// getContents(dataSnapshot);
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
我获取的数据如下所示:
public class MyDataClass {
public String id;
public String text2;
public MyDataClass() {
}
}
ArrayList<MyDataClass> listDataClass = new ArrayList<>();
mDatabase = FirebaseDatabase.getInstance().getReference().child("en-US");
mDatabase.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
MyDataClass myDataClass = datasnapshot.getValue(MyDataClass.class);
listDataClass.add(myDataClass);
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
// getContents(dataSnapshot);
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
ArrayList listDataClass=new ArrayList();
mDatabase=FirebaseDatabase.getInstance().getReference().child(“en-US”);
mDatabase.addChildEventListener(新的ChildEventListener(){
@凌驾
公共void onChildaded(@NonNull DataSnapshot DataSnapshot,@null字符串s){
MyDataClass MyDataClass=datasnapshot.getValue(MyDataClass.class);
添加(myDataClass);
}
@凌驾
public void onChildChanged(@NonNull DataSnapshot DataSnapshot,@null字符串s){
//getContents(dataSnapshot);
}
@凌驾
公共void onChildRemoved(@NonNull DataSnapshot DataSnapshot){
}
@凌驾
public void onChildMoved(@NonNull DataSnapshot DataSnapshot,@null字符串s){
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
现在的问题是:
虽然我只从每个子项的键“id”和“text2”中获取值,但还有其他字段(如meta、listOfTexts1等)。这些数据是否也会在该查询中提取,并使用免费firebase帐户的10GB/月限额?如果是,那么如何优化仅获取“id”和“text2”值
提前谢谢
这些数据是否也会在该查询中提取,并使用免费firebase帐户的10GB/月限额
是的,会的。在特定级别执行查询时,您获得的dataSnapshot
对象包含所有属性及其下的所有对象。因此,假设您正在根节点上添加一个侦听器,那么您将下载整个数据库。这是对带宽的难以置信的浪费,尤其是随着数据库的增长
如果是,那么如何优化仅获取“id”和“text2”值
如果您只需要id
和text2
fied,建议创建另一个节点,该节点将只包含具有这两个属性的对象(不包括meta、listOfTexts1等)。这种做法被称为非规范化
,是Firebase的常见做法。如果您是NoQSL数据库的新手,我建议您观看此视频,以便更好地理解
另外,在复制数据时,有一件事需要记住。与添加数据的方式相同,您需要对其进行维护。换句话说,如果你想更新/删除一个项目,你需要在它存在的每个地方都这样做。谢谢你的解释。现在我有两个节点node1包含具有基本信息的子节点(id和text2),而node2包含(元和嵌套列表数据,以及一个额外的字段来存储对node1中相同子节点的引用)。我在android的listview中从node1获取所有子节点。当我单击一个特定的列表项(节点1的子项)时,它应该只获取该特定子项的详细信息(来自节点2)。因此,我查询node2并使用.orderBy搜索来自node1的引用。它不是从node2获取完整快照,并且总带宽消耗保持不变吗?不客气!因此,当您从节点1获取仅包含基本信息(id和text2)的数据时,您只需为这些属性付费。如果单击以从node2获取数据,则将对整个对象负责(但仅当单击时)。现在清楚了吗?是的,再次谢谢。最后一个问题,使用.orderBy是否也有助于减少带宽消耗(除了为我过滤数据)?否,如果使用
setPersistenceEnabled(true)启用脱机持久性代码>。这意味着您只需从缓存中获取一次数据即可。使用Firebase无法从节点中仅读取某些字段。看见