Android 如何使用数据绑定库将Firebase侦听器转换为可观察的映射? TL;博士
有没有可能把所有的东西都藏在a后面 因此,我们所要做的就是:Android 如何使用数据绑定库将Firebase侦听器转换为可观察的映射? TL;博士,android,firebase,firebase-realtime-database,android-databinding,Android,Firebase,Firebase Realtime Database,Android Databinding,有没有可能把所有的东西都藏在a后面 因此,我们所要做的就是: User oldUser = map.put(user); User newUser = map.get(primaryKey); 全部问题 根据,为了写一个值,我必须通过定义一个资源路径并设置一个值 例如,如果我们有一个纯文本对象,我们会将其设置为: mDatabase.child("users") .push() .setValue(user); 为了读取整个用户树,我们必须实现一个。一旦新用户成为树的一部分,
User oldUser = map.put(user);
User newUser = map.get(primaryKey);
全部问题
根据,为了写一个值,我必须通过定义一个资源路径并设置一个值
例如,如果我们有一个纯文本对象,我们会将其设置为:
mDatabase.child("users")
.push()
.setValue(user);
为了读取整个用户
树,我们必须实现一个。一旦新用户成为树的一部分,将通过以下方式接收:
最后,为了阅读特定用户,我们使用:
因此,可以将an用作隐藏所有?TL;博士
我把它们组合成了一个小盒子
提供了一个工作示例。现在你所要做的就是:
// Remote updates immediately send you your view
map.addOnMapChangedCallback(mUserChangedCallback);
// Non blocking operation to update database
map.create(user);
// Local up-to-date cache
User user = map.get(primaryKey);
请记住在和中(取消)注册,以避免远程更新导致内存泄漏
积垢
首先,我们需要创建一个同义词库接口,例如:
可观测路线图
我们创建了一个抽象,扩展并实现了和
合同
为了不破坏合同,需要接口。例如,在给定位置插入新值时返回上一个值,但此操作现在是异步的
对于写入操作,这里的hack用于非阻塞和阻塞操作:
@Override
@WorkerThread
public V put(K key, V value) {
try {
return Tasks.await(create(key, value));
} catch (ExecutionException e) {
return null;
} catch (InterruptedException e) {
return null;
}
}
数据绑定
现在,您还可以免费享受以下服务:
及
静态类OnUserMapChanged扩展了OnMapChangedCallback{
@凌驾
onMapChanged公共无效(FirebaseArrayMap发送器,字符串键){
Log.e(标签、钥匙);
Log.e(标记,sender.get(key.toString());
}
}
记住在和中(取消)注册回调,以避免更新导致内存泄漏
// Remote updates immediately send you your view
map.addOnMapChangedCallback(mUserChangedCallback);
// Non blocking operation to update database
map.create(user);
// Local up-to-date cache
User user = map.get(primaryKey);
public interface CRUD<K, V> {
Task<V> create(V value);
Task<V> create(K key, V value);
Task<Void> createAll(SimpleArrayMap<? extends K, ? extends V> array);
Task<Void> createAll(Map<? extends K, ? extends V> map);
V read(K key);
Task<V> delete(K key);
Task<Void> free();
}
@Override
public Task<Void> createAll(Map<? extends K, ? extends V> map) {
Collection<Task<V>> tasks = new ArrayList<>(map.size());
for (Map.Entry<? extends K, ? extends V> entry : map.entrySet()) {
tasks.add(create(entry.getKey(), entry.getValue()));
}
return Tasks.whenAll(tasks);
}
@Override
public V read(K key) {
return get(key);
}
@Override
public Task<V> delete(K key) {
final V oldValue = get(key);
final Continuation<Void, V> onDelete = new Continuation<Void, V>() {
@Override
public V then(@NonNull Task<Void> task) throws Exception {
task.getResult();
return oldValue;
}
};
return mDatabaseReference.child(key.toString())
.setValue(null)
.continueWith(onDelete);
}
public abstract class FirebaseArrayMap<K extends Object, V> extends
ObservableArrayMap<K, V> implements ChildEventListener, CRUD<K, V> {
private final DatabaseReference mDatabaseReference;
public abstract Class<V> getType();
public FirebaseArrayMap(@NonNull DatabaseReference databaseReference) {
mDatabaseReference = databaseReference;
}
@Override
public void onCancelled(DatabaseError error) {
Log.e(TAG, error.getMessage(), error.toException());
}
@Override
public void onChildAdded(DataSnapshot snapshot, String previousChildName) {
if (snapshot.exists()) {
super.put((K) snapshot.getKey(), snapshot.getValue(getType()));
}
}
@Override
public void onChildChanged(DataSnapshot snapshot, String previousChildName) {
super.put((K)snapshot.getKey(), snapshot.getValue(getType()));
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {
super.put((K)snapshot.getKey(), snapshot.getValue(getType()));
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
super.remove(dataSnapshot.getKey());
}
@Override
@WorkerThread
public V put(K key, V value) {
try {
return Tasks.await(create(key, value));
} catch (ExecutionException e) {
return null;
} catch (InterruptedException e) {
return null;
}
}
@Override
protected onCreate() {
mUserMap = new UserArrayMap();
mChangedCallback = new OnUserMapChanged();
}
@Override
protected void onResume() {
super.onResume();
mUserMap.addOnMapChangedCallback(mChangedCallback);
}
@Override
protected void onPause() {
mUserMap.removeOnMapChangedCallback(mChangedCallback);
super.onPause();
}
static class OnUserMapChanged extends OnMapChangedCallback<FirebaseArrayMap<String, User>, String, User> {
@Override
public void onMapChanged(FirebaseArrayMap<String, User> sender, String key) {
Log.e(TAG, key);
Log.e(TAG, sender.get(key).toString());
}
}