Lah*_*ima 3 android firebase firebase-realtime-database google-cloud-firestore
我正在将一些数据存储在我的 android 应用程序在启动时加载的 firestore 中。我使用以下方法在应用程序启动时加载此数据。
FirebaseFirestore.getInstance().collection("users").document(ApplicationEx.getUserId()).collection("items").addSnapshotListener((queryDocumentSnapshots, e) -> {
if (queryDocumentSnapshots != null) {
LOGGER.info("items fetched. from cache: " + queryDocumentSnapshots.getMetadata().isFromCache());
for (QueryDocumentSnapshot queryDocumentSnapshot : queryDocumentSnapshots) {
items.add(queryDocumentSnapshot.toObject(Item.class));
}
}
});
Run Code Online (Sandbox Code Playgroud)
当我重新启动应用程序时,可以看到数据是从缓存中获取的,因为queryDocumentSnapshots.getMetadata().isFromCache()每次都返回 true。但是,当我检查 firebase 控制台时,我可以看到有时文档读取计数会增加。
行为不一致。当我连续多次重新启动应用程序时,读取计数在大多数情况下不会增加。但是,如果我有几分钟没有使用该应用程序然后启动该应用程序,则读取计数在大多数情况下都会增加。
存储的数据不会改变,所以这不可能是由于 android 同步了更改的数据。
这可能是什么原因?
我联系了 firebase 支持,据他们说这就是它在 firestore 中的工作方式。即使项目在本地缓存,当侦听器断开连接超过 30 分钟时,下一次提取也会从服务器读取所有文档。
我使用以下机制在一定程度上克服了我的问题。
编写一个新的 firebase 云函数来监听集合的写入。它将集合更新到实时数据库的时间写入。
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.onItemModified = functions.firestore.document('users/{userId}/items/{itemId}').onWrite((change, context) => {
return admin.database().ref('/users/' + context.params.userId + '/items-updated-at').set(Date.now());
});
Run Code Online (Sandbox Code Playgroud)
在android中,在应用程序启动时,禁用网络,加载项目,然后再次启用网络。
FirebaseFirestore.getInstance().disableNetwork().addOnCompleteListener(task -> loadItems());
private void loadItems() {
Utils.getFirestoreCollection(COLLECTION_NAME_ITEMS).get().addOnCompleteListener(task -> {
//Cache loaded items in memory
FirebaseFirestore.getInstance().enableNetwork();
}
}
Run Code Online (Sandbox Code Playgroud)
在android中,在写入最后一项更新时间的实时数据库路径中添加一个监听器。当更新事件被触发时,再次读取项目并更新内存缓存。将item更新时间保存在android共享首选项中,所以下次update事件触发时,检查RTDB的更新时间是否大于保存时间,只有RTDB更新时间大于保存时间才重新读取item。
| 归档时间: |
|
| 查看次数: |
3145 次 |
| 最近记录: |