Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.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
Android 为文档提供UID';姓名_Android_Firebase_Google Cloud Firestore - Fatal编程技术网

Android 为文档提供UID';姓名

Android 为文档提供UID';姓名,android,firebase,google-cloud-firestore,Android,Firebase,Google Cloud Firestore,我想知道在firestore数据库中保存用户首选项的最佳做法是什么。 我会尝试用一个例子来解释 案例1 我的“用户”集合中有此类文档(名称由Firebase随机生成),包含3个字段: 用户\u uid:字符串 昵称:字符串 android_lover:布尔值 在我的Android项目中,当我想搜索用户“DFDDE45554SDC”的文档时,我会搜索where user_uid=“DFDDE45554SDC” 案例2 我的“用户”集合中有此类文档(名称是使用用户的UID创建的),包含两个字段:

我想知道在firestore数据库中保存用户首选项的最佳做法是什么。 我会尝试用一个例子来解释

案例1 我的“用户”集合中有此类文档(名称由Firebase随机生成),包含3个字段:

  • 用户\u uid:字符串
  • 昵称:字符串
  • android_lover:布尔值
在我的Android项目中,当我想搜索用户“DFDDE45554SDC”的文档时,我会搜索where user_uid=“DFDDE45554SDC”

案例2 我的“用户”集合中有此类文档(名称是使用用户的UID创建的),包含两个字段:

  • 昵称:字符串
  • android_lover:布尔值
在我的Android项目中,当我想搜索用户“DFDDE45554SDC”的文档时,我只搜索文档“DFDDE45554SDC”


我指定:我不想要重复的用户。
那么,最佳实践是什么(安全、优化等)?为什么?

我认为案例2更有效,原因如下:

  • 我们已经知道用户的ID,所以不需要在这里使用其他ID
  • 使用
    userscolection.document(userId)
    构造简单,是直接的
    DocumentReference
    ,而不是
    查询
    ,因此:
    • DocumentReference
      可以存储在Firestore数据库中,而
      查询不能
    • DocumentReference
      可能比指示Firestore数据库使用
      whereEqualTo(“user\u uid”,userId)
      执行过滤查询更具扩展性(尽管使用索引,此时性能差异可能可以忽略不计)
    • 查询
      将始终返回结果集合(即使只有1个),而不是确切的文档
  • 目前不需要为用户集合中的每个文档随机生成不同的ID,因为用户ID已经是唯一的
  • 每个用户只需要一个文档,因此这是一种确保不会有任何副本的可靠方法
我能想到的使用
案例1
的唯一真正动机是将您的文档命名方案与数据库中的其他集合标准化,但这对Firestore来说并不重要

关于Android中的两个示例:

案例1

db.collection("users")
    .whereEqualTo("user_uid", "DFDDE45554SDC")
    .limit(1)
    .get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {
                for (DocumentSnapshot document : task.getResult()) {
                    // Even with limit(1), we still receive a collection
                    // so iterate this to obtain the desired document
                }
            }
        }
    });
db.collection(“用户”)
.whereEqualTo(“用户uid”、“DFDDE45554SDC”)
.限额(1)
.get().addOnCompleteListener(新的OnCompleteListener()){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
对于(DocumentSnapshot文档:task.getResult()){
//即使有限制(1),我们仍然会收到一笔收款
//因此,重复此操作以获得所需的文档
}
}
}
});
案例2

db.collection("users")
    .document("DFDDE45554SDC")
    .get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            if (task.isSuccessful() && task.getResult() != null) {
                // We have access to the single desired document directly
                DocumentSnapshot document = task.getResult();
            }
        }
    });
db.collection(“用户”)
.文件(“DFDDE45554SDC”)
.get().addOnCompleteListener(新的OnCompleteListener()){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()&&task.getResult()!=null){
//我们可以直接访问所需的单个文档
DocumentSnapshot document=task.getResult();
}
}
});

我想这要看情况而定。假设有两个登录选项提供给用户facebook,phone Auth。因此,在这种情况下,firestore中一个用户的一个唯一用户文档将有两个uid。因此,在这种情况下,应首选情况1。