如何将Firebase文档参考转换为Firebase查询?

时间:2019-04-09 16:18:15

标签: android firebase google-cloud-firestore

我阅读了有关使用体系结构组件的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

数据库的屏幕截图:

enter image description here

文档ID用于获取文档,因此我得到的是文档参考,而不是馆藏参考。

2 个答案:

答案 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|
----------------------------------------