android - 如果已设置,如何避免设置 firestore 文档字段
问题描述
每次活动开始时,Firebase 文档字段都会重置,我需要它们持续存在。
集合和文档的创建是在 onResume 中使用“setOptions.merge()”完成的,文档值对于 String 设置为 null,对于数组设置为 emptyList。
@Override
protected void onResume() {
super.onResume();
//Creating the document if it does not already exist.
Map<String, Object> read_book = new HashMap<>();
read_book.put("read_pages", Collections.emptyList());
read_book.put("total_pages", null);
fireStoreDB.collection("user_" + user.getId).document("book_" + book.getId())
.set(read_book, SetOptions.merge())
.addOnSuccessListener(aVoid ->
Log.d("Activity", "FirestoreDB => created empty read_pages and total_pages"))
.addOnFailureListener(e ->
Log.d("Activity", "Firestore failed to create empty read_pages and total_pages" + e));
}
private void pageFlip(String currentPage, String totalPages){
// Add read page to array (no duplicates)
fireStoreDB.collection("user_" + user.getId).document("book_" + book.getId())
.update("read_pages", FieldValue.arrayUnion(currentPage))
.addOnSuccessListener(aVoid ->
Log.d("Activity", "FirestoreDB => updated read_pages " + currentPage))
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.d("Activity", "FirestoreDB => failed to update read_pages" + e);
}
});
// Set total book pages number
fireStoreDB.collection("user_" + user.getId).document("book_" + book.getId())
.update("total_pages", totalPages)
.addOnSuccessListener(aVoid ->
Log.d("Activity", "FirestoreDB => updated total_pages " + totalPages))
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.d("Activity", "FirestoreDB => failed to update total_pages" + e);
}
});
}
使用上面的代码,每次调用 onResume 时,该字段都会被重置为 null 和空列表。
我需要 total_pages 值和 read_pages 数组在 Activity 重新启动时持续存在,并可以使用 FieldValue.arrayUnion 向 read_pages 数组添加新值。
什么是实现我的用例的有效方法?
解决方案
您可以直接将 set 方法与 SetOptions.merge() 一起使用,无需使用空值初始化
private void pageFlip(String currentPage, String totalPages){
Map<String, Object> data = new HashMap<>();
data.put("total_pages", totalPages);
data.put("read_pages", FieldValue.arrayUnion(currentPage));
// Add read page to array (no duplicates)
fireStoreDB.collection("user_" + user.getId).document("book_" + book.getId())
.set(data, SetOptions.merge())
.addOnSuccessListener(aVoid ->
Log.d("Activity", "FirestoreDB => updated read_pages " + currentPage))
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.d("Activity", "FirestoreDB => failed to update read_pages" + e);
}
});
}
推荐阅读
- java - 找不到设置级联逻辑的模式
- html - 该
元素使用安全吗? - json - 如何使用雪花 object_construct() 函数而不是按键排序来维护元素的顺序?
- c# - How to open multiple links in different windows using selenium and C#
- hdfs - 为什么 Impala 花费大量时间打开 HDFS 文件 (TotalRawHdfsOpenFileTime)?
- java - spring boot 不包括 .jar 文件上的 RestController
- java - ClassUtils.getDefaultClassLoader().getResource("").getPath() 得到的结果值包含'!'
- verilog - Verilog / SystemC中的Dataflow模型和RTL样式编码有什么区别
- css - Bootstrap全屏模式右侧错误
- pandas - `replace` 对数据框不起作用