【问题标题】:Accessing data stored as Object in Firestore database访问在 Firestore 数据库中存储为对象的数据
【发布时间】:2017-10-23 09:01:07
【问题描述】:

最近我开始测试 Firebase 新文档 db Firestore 以用于学习目的,我现在被困在将存储在文档中的值作为对象访问。

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

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());
        }
    }
});

感谢任何帮助,谢谢。

【问题讨论】:

    标签: android firebase google-cloud-firestore


    【解决方案1】:

    您文档中的privacy 字段可以视为Map&lt;String, Boolean&gt;,因此您可以将此字段的值转换为这样的变量:

    HashMap<String, Boolean> privacy = (HashMap<String, Boolean>) task.getResult().getData().get("privacy");
    

    现在的主要问题是您可能会看到 "unchecked cast" compiler warning,因为像这样强制转换 Map 并不理想,因为您不能保证数据库结构将始终包含 String : Boolean 值字段。

    在这种情况下,我建议在您的数据库中使用custom objects to storeretrieve objects,它会自动为您处理编组和强制转换:

    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());
            }
        }
    });
    

    你的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;
        }
    }
    

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

    HashMap<String, Boolean> userPrivacy = user.getPrivacy();
    

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

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

    【讨论】:

    • 感谢Grimthorr的详细解释。但是如果存储在对象中的值是不同的数据类型,我们将如何处理呢?就像在隐私中一样,一些属性是布尔值,而另一些是字符串?
    • 在这种情况下,您可以将HashMap&lt;String, Object&gt; 用于privacy 字段,然后在需要时手动转换每个项目,例如:(Boolean) privacy.get("friends_challenge")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2019-10-23
    • 2021-11-15
    • 2013-01-10
    • 2019-09-15
    相关资源
    最近更新 更多