问题描述
首先,我希望任何人都可以使用下面的文档参考来帮助调整我的代码行。
从下面的 firebase 控制台可以看出,我的 FaceEmotion-id 文档有 Faceemotion 和 Timestamp 字段。 使用我下面的代码,每次用户得到不同的情绪时,firestore 都会覆盖这些情绪。因此,我无法看到用户在使用我的应用程序时以及他/她使用我的应用程序的时间不同时得到的不同情绪。
我需要防止覆盖上面提到的两个字段。请帮我。我想要的是在文档中添加字段而不是覆盖它。
另外,我不知道如何为名为 FaceEmotion-id 的文档生成不同的 id。我实际上已经使用 Uid 事先引用了该文档,您可以从下面的代码中看到。但是对于“结果”集合中的子文档。我似乎找不到让它独一无二的方法。
这是我的代码:
public static final String TAG = "TAG";
FirebaseAuth fAuth;
FirebaseFirestore fStore;
String userID;
String FaceEmotion;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detection);
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
StartQues = (Button) findViewById(R.id.view_question);
StartQues.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String Emotion = EmotionType.toString();
userID = fAuth.getCurrentUser().getUid();
FaceEmotion = "FaceEmotion";
DocumentReference documentReference = fStore.collection("users").document(userID).collection("Result").document("FaceEmotion-id");
//DocumentReference documentReference = fStore.collection("users").document(userID).collection("FaceEmotion").document(Emotion);
Map<String,Object> user = new HashMap<>();
user.put("FaceEmotion",Emotion);
user.put("timestamp",FieldValue.serverTimestamp());
documentReference.set(user).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d(TAG,"onSuccess: Data has been saved "+ userID);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.d(TAG,"onFailure: " + e.toString());
}
});
解决方法
听起来您想要存储时间戳和表情符号列表。如果您想将它们存储在单个文档中,逻辑数据结构将是将它们存储在一个数组/集合中,如下所示:
user.put("FaceEmotion",Emotion);
user.put("timestamp",FieldValue.serverTimestamp());
documentReference.update("emotions",FieldValue.arrayUnion(user))
这段代码每次运行时,都会向文档中的 emotions
数组添加一个新项目。
另请参阅 updating elements in an array 上的 Firebase 文档。