Android:如何优化从Firebase提取数据?

时间:2019-03-08 10:40:51

标签: java android firebase firebase-realtime-database

我在firebase中遵循树结构。 enter image description here

现在,在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) {

        }
    });

现在的问题是: 尽管我只是从每个孩子的键“ id”和“ text2”中获取值,但还有其他字段(例如 meta ,listOfTexts1等)。是否还会在此查询中获取这些内容,并从每月10GB的免费Firebase帐户限额中消费?如果是,那么我该如何优化以仅获取“ id”和“ text2”值?

谢谢。

2 个答案:

答案 0 :(得分:1)

  

是否还会在此查询中获取这些内容,并从每月10GB的免费Firebase帐户限额中消费?

是的,它将。当您在特定级别执行查询时,获得的dataSnapshot对象包含所有属性及其下的所有对象。因此,假设您要在根节点上添加一个侦听器,那么您将下载整个数据库。这非常浪费带宽,尤其是随着数据库的增长。

  

如果是,那么如何优化以仅获取“ id”和“ text2”值?

如果仅需要idtext2字段,建议创建另一个节点,该节点将仅包含具有这两个属性的对象(不包括meta,listOfTexts1等)。这种做法称为denormalization,是Firebase的常见做法。如果您不熟悉NoQSL数据库,建议您观看此视频Denormalization is normal with the Firebase Database,以便更好地了解。

此外,在复制数据时,需要记住一件事。用与添加数据相同的方式,您需要对其进行维护。换句话说,如果您想更新/删除项目,则需要在它存在的每个位置进行。

答案 1 :(得分:0)

仅使用MAP类获取唯一的数据具有想要的优化方式

Map<String,String> map=dataSnapshot.getValue(Map.class);
  String value1 = map.get("id");
  String value2 = map.get("text2");
  System.out.println(String.toString(value1));