Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用数据绑定库将Firebase侦听器转换为可观察的映射? TL;博士_Android_Firebase_Firebase Realtime Database_Android Databinding - Fatal编程技术网

Android 如何使用数据绑定库将Firebase侦听器转换为可观察的映射? TL;博士

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); 为了读取整个用户树,我们必须实现一个。一旦新用户成为树的一部分,

有没有可能把所有的东西都藏在a后面

因此,我们所要做的就是:

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());
    }

}