Android体系结构组件与Firebase特别是Firestore

Android体系结构组件与Firebase特别是Firestore,android,firebase,firebase-realtime-database,google-cloud-firestore,Android,Firebase,Firebase Realtime Database,Google Cloud Firestore,我是由(Firebase开发人员倡导者)完成的 该博客讨论了如何在android架构组件中使用firebase实时数据库 有一个类FirebaseQueryLiveData,它形成了一个可重用的类来管理所有Firebase查询以及实现LiveData。不过,这完全适用于Firebase实时数据库,我似乎无法更改或更改它以支持云firestore数据库。 这是密码 public class FirebaseQueryLiveData extends LiveData<DataSnapshot

我是由(Firebase开发人员倡导者)完成的 该博客讨论了如何在android架构组件中使用firebase实时数据库

有一个类
FirebaseQueryLiveData
,它形成了一个可重用的类来管理所有Firebase查询以及实现LiveData。不过,这完全适用于Firebase实时数据库,我似乎无法更改或更改它以支持云firestore数据库。

这是密码

public class FirebaseQueryLiveData extends LiveData<DataSnapshot> {
    private static final String LOG_TAG = "FirebaseQueryLiveData";

    private final Query query;
    private final MyValueEventListener listener = new MyValueEventListener();

    public FirebaseQueryLiveData(Query query) {
        this.query = query;
    }

    public FirebaseQueryLiveData(DatabaseReference ref) {
        this.query = ref;
    }

    @Override
    protected void onActive() {
        Log.d(LOG_TAG, "onActive");
        query.addValueEventListener(listener);
    }

    @Override
    protected void onInactive() {
        Log.d(LOG_TAG, "onInactive");
        query.removeEventListener(listener);
    }

    private class MyValueEventListener implements ValueEventListener {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            setValue(dataSnapshot);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.e(LOG_TAG, "Can't listen to query " + query, databaseError.toException());
        }
    }
}
公共类FirebaseQueryLiveData扩展LiveData{
私有静态最终字符串日志\u TAG=“FirebaseQueryLiveData”;
私有最终查询;
私有最终MyValueEventListener=新的MyValueEventListener();
公共FirebaseQueryLiveData(查询){
this.query=query;
}
公共FirebaseQueryLiveData(数据库参考ref){
this.query=ref;
}
@凌驾
受保护的void onActive(){
Log.d(Log_标签“onActive”);
query.addValueEventListener(listener);
}
@凌驾
受保护的void onInactive(){
Log.d(Log_标签,“onInactive”);
removeEventListener(监听器);
}
私有类MyValueEventListener实现ValueEventListener{
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
设置值(dataSnapshot);
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
Log.e(Log_标记,“无法侦听查询”+query,databaseError.toException());
}
}
}

这是@JobM post的查询版本。谢谢@JobM!为了清晰起见,我建议将@JobM的版本重命名为FirebaseDocumentLiveData

import android.arch.lifecycle.LiveData;
import android.os.Handler;
import android.util.Log;

import com.google.firebase.firestore.EventListener;
import com.google.firebase.firestore.FirebaseFirestoreException;
import com.google.firebase.firestore.ListenerRegistration;
import com.google.firebase.firestore.Query;
import com.google.firebase.firestore.QuerySnapshot;

import javax.annotation.Nullable;

public class FirebaseQueryLiveData extends LiveData<QuerySnapshot> {
    public static final String TAG = "FbaseQueryLiveData";

    private Query query;
    private final MyValueEventListener listener = new MyValueEventListener();
    private ListenerRegistration listenerRegistration;

    private boolean listenerRemovePending = false;
    private final Handler handler = new Handler();

    public FirebaseQueryLiveData(Query query) {
        this.query = query;
    }

    private final Runnable removeListener = new Runnable() {
        @Override
        public void run() {
            listenerRegistration.remove();
            listenerRemovePending = false;
        }
    };

    @Override
    protected void onActive() {
        super.onActive();

        Log.d(TAG, "onActive");
        if (listenerRemovePending) {
            handler.removeCallbacks(removeListener);
        }
        else {
            listenerRegistration = query.addSnapshotListener(listener);
        }
        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);
        listenerRemovePending = true;
    }

    private class MyValueEventListener implements EventListener<QuerySnapshot> {
        @Override
        public void onEvent(@Nullable QuerySnapshot querySnapshot, @Nullable FirebaseFirestoreException e) {
            if (e != null){
                Log.e(TAG, "Can't listen to query snapshots: " + querySnapshot + ":::" + e.getMessage());
                return;
            }
            setValue(querySnapshot);
        }
    }
}
导入android.arch.lifecycle.LiveData;
导入android.os.Handler;
导入android.util.Log;
导入com.google.firebase.firestore.EventListener;
导入com.google.firebase.firestore.FirebaseFirestoreException;
导入com.google.firebase.firestore.ListenerRegistration;
导入com.google.firebase.firestore.Query;
导入com.google.firebase.firestore.QuerySnapshot;
导入javax.annotation.Nullable;
公共类FirebaseQueryLiveData扩展了LiveData{
公共静态最终字符串TAG=“FbaseQueryLiveData”;
私有查询;
私有最终MyValueEventListener=新的MyValueEventListener();
私人收听者注册收听者注册;
私有布尔listenerRemovePending=false;
私有最终处理程序=新处理程序();
公共FirebaseQueryLiveData(查询){
this.query=query;
}
private final Runnable removeListener=new Runnable(){
@凌驾
公开募捐{
listenerRegistration.remove();
listenerRemovePending=false;
}
};
@凌驾
受保护的void onActive(){
super.onActive();
Log.d(标记为“onActive”);
如果(listenerRemovePending){
handler.removeCallbacks(removeListener);
}
否则{
listenerRegistration=query.addSnapshotListener(listener);
}
listenerRemovePending=false;
}
@凌驾
受保护的void onInactive(){
super.onInactive();
Log.d(标签“onInactive:”);
//侦听器删除计划延迟两秒
handler.postDelayed(removeListener,2000);
listenerRemovePending=true;
}
私有类MyValueEventListener实现EventListener{
@凌驾
公共void OneEvent(@Nullable QuerySnapshot QuerySnapshot,@Nullable FirebaseFirestoreException e){
如果(e!=null){
Log.e(标记“无法侦听查询快照:”+querySnapshot+“:”+e.getMessage());
返回;
}
设置值(querySnapshot);
}
}
}
献给Kotlin的情人:)

导入android.os.Handler
导入androidx.annotation.Nullable
导入androidx.lifecycle.LiveData
导入com.google.firebase.firestore*
进口木材
类FirebaseQueryLiveData(私有val查询:query):LiveData(){
private val listener=MyValueEventListener()
私有变量listenerRegistration:listenerRegistration?=null
私有变量listenerRemovePending=false
private val handler=handler()
private val removeListener=Runnable{
listenerRegistration!!.remove()
listenerRemovePending=false
}
override-onActive(){
super.onActive()
木材d(“onActive”)
如果(listenerRemovePending){
handler.removeCallbacks(removeListener)
}否则{
listenerRegistration=query.addSnapshotListener(监听器)
}
listenerRemovePending=false
}
重写函数onInactive(){
super.onInactive()
木材d(“onInactive:”)
//侦听器删除计划延迟两秒
handler.postDelayed(removeListener,2000)
listenerRemovePending=true
}
私有内部类MyValueEventListener:EventListener{
覆盖有趣的OneEvent(@Nullable querySnapshot:querySnapshot?,@Nullable e:FirebaseFirestoreException?){
如果(e!=null){
e(e,“无法侦听查询快照:%s”,querySnapshot)
返回
}
值=querySnapshot
}
}
}

请解释困难或错误是什么。当你运行代码时会发生什么?嘿,鲍勃。Firestore没有类似Firebase Realtime的方法,即ValueEventListener、addValueEventListener。它还有其他相同的实现,我发现在上面的逻辑中很难使用。当我在Firebase实时数据库上工作时,它运行得很好,但我不能将其用于Firestore。Firestore有一个带有快照侦听器的查询。如何使用android架构组件(Jetpack)写入DB(Firestore)?能
import android.os.Handler
import androidx.annotation.Nullable
import androidx.lifecycle.LiveData
import com.google.firebase.firestore.*
import timber.log.Timber

class FirebaseQueryLiveData(private val query: Query) : LiveData<QuerySnapshot>() {
    private val listener = MyValueEventListener()
    private var listenerRegistration: ListenerRegistration? = null

    private var listenerRemovePending = false
    private val handler = Handler()

    private val removeListener = Runnable {
        listenerRegistration!!.remove()
        listenerRemovePending = false
    }

    override fun onActive() {
        super.onActive()

        Timber.d( "onActive")
        if (listenerRemovePending) {
            handler.removeCallbacks(removeListener)
        } else {
            listenerRegistration = query.addSnapshotListener(listener)
        }
        listenerRemovePending = false
    }

    override fun onInactive() {
        super.onInactive()

        Timber.d("onInactive: ")
        // Listener removal is schedule on a two second delay
        handler.postDelayed(removeListener, 2000)
        listenerRemovePending = true
    }

    private inner class MyValueEventListener : EventListener<QuerySnapshot> {
        override fun onEvent(@Nullable querySnapshot: QuerySnapshot?, @Nullable e: FirebaseFirestoreException?) {
            if (e != null) {
                Timber.e(e, "Can't listen to query snapshots: %s", querySnapshot)
                return
            }
            value = querySnapshot
        }
    }
}