现在,在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”值?
谢谢。
答案 0 :(得分:1)
是否还会在此查询中获取这些内容,并从每月10GB的免费Firebase帐户限额中消费?
是的,它将。当您在特定级别执行查询时,获得的dataSnapshot
对象包含所有属性及其下的所有对象。因此,假设您要在根节点上添加一个侦听器,那么您将下载整个数据库。这非常浪费带宽,尤其是随着数据库的增长。
如果是,那么如何优化以仅获取“ id”和“ text2”值?
如果仅需要id
和text2
字段,建议创建另一个节点,该节点将仅包含具有这两个属性的对象(不包括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));