Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:如何优化从firebase获取数据?_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Java Android:如何优化从firebase获取数据?

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

我在firebase中创建了以下树结构。

现在在AndroidStudio中,我想从“en-US”的子节点(在本例中是节点1552040445614和1552040702223)获取数据

当我只需要键“id”和“text2”的值时,我用Java编写了一个数据模型类,如下所示:

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无法从节点中仅读取某些字段。看见