Android体系结构组件与Firebase特别是Firestore
我是由(Firebase开发人员倡导者)完成的 该博客讨论了如何在android架构组件中使用firebase实时数据库 有一个类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
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
}
}
}