在Firestore数据库中访问存储为Object的数据

Kum*_*vek 7 android firebase google-cloud-firestore

数据库结构

最近我开始测试Firebase新文档db Firestore用于学习目的,我现在卡在文档内作为对象访问值存储.

我使用下面的代码来访问Privacy存储在文档中的对象,但我不知道如何访问Key - Value?例如Key - Value,对象中有3个子对,我将如何单独访问和编辑它?

DocumentReference docRef = FirebaseFirestore.getInstance().collection("Users").document("PQ8QUHno6QdPwM89DsVTItrHGWJ3");
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            DocumentSnapshot document = task.getResult();
            if (document != null) {
                Log.d(TAG, "DocumentSnapshot data: " + task.getResult().getData().get("privacy"));
                Object meta_object = task.getResult().getData().get("privacy");
            } else {
                Log.d(TAG, "No such document");
            }
        } else {
            Log.d(TAG, "get failed with ", task.getException());
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏,谢谢.

Gri*_*orr 8

privacy文档中的字段可以被视为a Map<String, Boolean>,因此您可以将此字段的值转换为这样的变量:

HashMap<String, Boolean> privacy = (HashMap<String, Boolean>) task.getResult().getData().get("privacy");
Run Code Online (Sandbox Code Playgroud)

现在主要的问题是你可能会看到一个"未经检查的强制转换"编译器警告,因为Map像这样投射并不理想,因为你不能保证数据库结构总是包含String : Boolean这个字段中的值.

在这种情况下,我建议使用自定义对象来存储检索数据库中的对象,这将自动为您处理编组和转换:

DocumentReference docRef = FirebaseFirestore.getInstance().collection("Users").document("PQ8QUHno6QdPwM89DsVTItrHGWJ3");
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            DocumentSnapshot document = task.getResult();
            if (document != null) {
                User user = task.getResult().toObject(User.class);
            } else {
                Log.d(TAG, "No such document");
            }
        } else {
            Log.d(TAG, "get failed with ", task.getException());
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

你的User班级是这样的:

public class User {
    private String username;
    private HashMap<String, Boolean> privacy;

    public User() {}

    public User(String username, HashMap<String, Boolean> privacy) {
        this.username = username;
        this.privacy = privacy;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public HashMap<String, Boolean> getPrivacy() {
        return username;
    }

    public void setPrivacy(HashMap<String, Boolean> privacy) {
        this.privacy = privacy;
    }
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,User user = task.getResult().toObject(User.class)调用将整个文档编组为User对象的实例,然后您可以使用以下命令访问隐私地图:

HashMap<String, Boolean> userPrivacy = user.getPrivacy();
Run Code Online (Sandbox Code Playgroud)

文档中的每个字段将与自定义对象中具有相同名称的字段匹配,因此您也可以以相同的方式添加settingsphoto_url字段.你只需要记住:

每个自定义类必须具有不带参数的公共构造函数.此外,该类必须包含每个属性的公共getter.