我阅读了有关使用体系结构组件的Firebase博客。
来源: https://firebase.googleblog.com/2017/12/using-android-architecture-components.html
现在要在我的应用中实现相同的功能,我想知道如何将Firebase Document Reference
转换为Firebase Query
数据类型。
有人可以帮我吗?
我认为该代码并不是真正必要的代码,但仍会提供它以更好地进行说明。
注意:
1.我正在使用Firebase Firestore(参考博客使用Firebase实时数据库),因此我更改了代码(请参阅另一篇SO文章)。
FirebaseQueryLiveData.java:
public class FirebaseQueryLiveData extends LiveData<QuerySnapshot> {
// Logging constant
private static final String TAG = "FirebaseQueryLiveData";
// Query
private final Query query;
// Listener
private final MyValueEventListener listener = new MyValueEventListener();
private ListenerRegistration listenerRegistration;
// Handler
private final Handler handler = new Handler();
// Flag to remove listener
private boolean listenerRemovePending = false;
// Remove listener runnable
private final Runnable removeListener = new Runnable() {
@Override
public void run() {
listenerRegistration.remove();
listenerRemovePending = false;
}
};
public FirebaseQueryLiveData(Query query) {
this.query = query;
}
@Override
protected void onActive() {
super.onActive();
Log.d(TAG, "onActive");
// Check flag
if (listenerRemovePending) {
handler.removeCallbacks(removeListener);
} else {
listenerRegistration = query.addSnapshotListener(listener);
}
// Update flag
listenerRemovePending = false;
}
@Override
protected void onInactive() {
super.onInactive();
Log.d(TAG, "onInactive");
// Listener removal is schedule on a two second delay
handler.postDelayed(removeListener, 2000);
// Update flag
listenerRemovePending = true;
}
// Listener definition
private class MyValueEventListener implements EventListener<QuerySnapshot> {
@Override
public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
Log.d(TAG, "onEvent");
// Check for error
if (e != null) {
Log.d(TAG, "Can't listen to query snapshots: " + queryDocumentSnapshots
+ ":::" + e.getMessage());
return;
}
// Set value if listening is successful
setValue(queryDocumentSnapshots);
}
}
}
使用Firebase集合引用查看模型(根据Firebase文档,该模型属于Query数据类型。)
// Initialize Firebase variables
private static final FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
private static final FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
// Query
private static final Query QUERY = FirebaseFirestore.getInstance().collection(COLLECTION_ORDERS)
.whereEqualTo(ATTRIBUTE_USER_UID, Objects.requireNonNull(firebaseUser).getUid());
// Firebase query live data
private final FirebaseQueryLiveData firebaseQueryLiveData =
new FirebaseQueryLiveData(QUERY);
@NonNull
public LiveData<QuerySnapshot> getQuerySnapshotLiveData() {
Log.d(TAG, "getQuerySnapshotLiveData");
return firebaseQueryLiveData;
}
带有文档参考的代码:
private static final DocumentReference documentReference = FirebaseFirestore.getInstance()
.collection("cart")
.document(Objects.requireNonNull(firebaseUser).getUid());
private static final Query QUERY = documentReference;
在上面的代码片段中:
private static final Query QUERY = documentReference;
行显示以下错误:
不兼容的类型。
必需:com.google.firebase.firestore.Query
找到:com.google.firebase.firestore.DocumentReference
数据库的屏幕截图:
文档ID用于获取文档,因此我得到的是文档参考,而不是馆藏参考。
答案 0 :(得分:0)
您遇到以下错误:
不兼容的类型。 必需:com.google.firebase.firestore.Query找到:com.google.firebase.firestore.DocumentReference
在此特定代码行:
private static final Query QUERY = documentReference;
因为您正在尝试将DocumentReference对象分配给Query对象。
如何将Firebase文档参考转换为Firebase查询?
实际上这在Java中是不可能的,因为在这两个类之间没有继承关系。您可以分配一个CollectionReference,因为它扩展了Query类,但从来没有扩展DocumentReference
。
要获取单个文档,只需使用DocumentReference
对象,而永远不要为其分配其他类型的对象。
答案 1 :(得分:0)
这不是一个确切的答案,而是我在应用程序中使用的可行的破解方法。
创建了另一个用于处理文档参考的文件,并根据需要使用了文件。
FirebaseDocumentLiveData.java
----------------------------------------
|FIELD1|today_count | This_month_count |
----------------------------------------
| NAME1| 10 | 3442|
| NAME2| 15 | 4342|
----------------------------------------