java - 如何使用 firebase 数据库更新本地对象

标签 java android firebase firebase-realtime-database

总的来说,我对 android 和 java 很陌生。

我正在尝试创建一个 Android 应用程序,其中我将对象存储在 firebase 实时数据库中。根据需要,我使用 addListnerForSingleValueEvent 从数据库获取对象。

mDatabase.child(itemType).child(id).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            T entity = dataSnapshot.getValue(typeParameterClass);
            callback.onSuccess(entity);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            callback.onFailure();
        }
    });

这里的callback是我自己的回调类的一个对象。

我试图了解如何始终保持实体更新。

有没有一种方法可以保留对我创建的实体对象的引用,并在使用 addValueEventListner 在数据库中更新对象时更新它,以便它反射(reflect)在整个应用程序中?据我所知,在回收站 View 中数据会自动更新。我的问题不是针对回收者 View 的情况。

如果有这样的方法,那么我该如何处理不同的代码为同一个数据库对象创建不同的客户端对象的情况?有没有办法在客户端中强制每个数据库对象使用单个对象?

我希望我的问题不是含糊不清。

编辑1:

基于Comment,添加简约的数据库结构。还有更多像“消息”这样复杂的结构(包含列表等)。

screenshot of database

编辑2:

据我了解,addValueEventListner 将为数据库中的每次更新触发 onDataChange 方法。我的问题是如何使本地对象保持最新以及如何为客户端中的每个数据库对象强制执行单个本地对象。请阅读原始问题以了解更多详细信息。

最佳答案

使用

addValueEventListener

而不是

addListenerForSingleValueEvent

示例:

// My top posts by number of stars
mDatabase.child(itemType).child(id).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {
            // TODO: handle the post
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        // Getting Post failed, log a message
        Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
        // ...
    }
});

关于java - 如何使用 firebase 数据库更新本地对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55841707/

相关文章:

javascript - React - 访问对象集合

java - PDFBox - 查找页面尺寸

java - 在 Angular 2 中设置授权 header

java - 用户界面 :repeat does not work in JSF 2. 0?

ios - Xamarin Firebase iOS 11 未生成 FCM token

android - FCM 通知 click_action 不起作用

java - 为什么这个 int 不递增?

android - 任何人都可以解释服务 setForeground 方法吗?

java - 如何读取/更新存储在 map 中的值,然后在 Cloud Firestore 中的数组中?

android - 以 getApplication() 作为上下文的对话框抛出 "Unable to add window — token null is not for an application”