从Android应用程序未将数据保存到Firebase

8

我有一个现有的应用程序,我正在尝试将其转换为使用Firebase数据库。这是我在尝试保存对象时使用的一些代码:

...
private FirebaseDatabase database;
private DatabaseReference waypointRef;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ...

    database = FirebaseDatabase.getInstance();
    waypointRef = database.getReference(Utils.WAYPOINT_REFERENCE);

    waypointRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
            FBWaypoint wp = dataSnapshot.getValue(FBWaypoint.class);
            wp.setId(dataSnapshot.getKey());
            Log.e(TAG, String.format("Child Added:  %s, %s, %s, Prev: %s", wp.getName(), wp.getLatitude(), wp.getLongitude(), previousChildName));
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) {
            FBWaypoint wp = dataSnapshot.getValue(FBWaypoint.class);
            Log.e(TAG, String.format("Child Changed:  %s, %s, %s, Prev: %s", wp.getName(), wp.getLatitude(), wp.getLongitude(), previousChildName));
        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
            FBWaypoint wp = dataSnapshot.getValue(FBWaypoint.class);
            wp.setId(dataSnapshot.getKey());
            Log.e(TAG, String.format("Child Removed:  %s, %s, %s, Prev: %s", wp.getName(), wp.getLatitude(), wp.getLongitude()));
        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {
            FBWaypoint wp = dataSnapshot.getValue(FBWaypoint.class);
            Log.e(TAG, String.format("Child Moved:  %s, %s, %s, Prev: %s", wp.getName(), wp.getLatitude(), wp.getLongitude(), previousChildName));
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.e(TAG, "Failed to add Child Listener.", databaseError.toException());
        }
    });
    ...
}

创建对象后,我会这样保存:

waypointRef.push().setValue(wp);

我在日志中看到回调函数在这一点上触发(以及由Firebase生成的ID的值:

Child Added:  Hrbrbe, 44.969846, -89.670527, Prev: null
Child Added:  Hdbece, 44.956019, -89.666436, Prev: -KInIzqk6m96lwVWF6Pc
Child Added:  Hebdbr R, 44.970372, -89.673188, Prev: -KInJ17sfsQ4v_fUrAW3

然而,我在firebase控制台中没有看到这些记录。此外,当我重新启动应用程序时,onChildAdded回调函数不会被触发。
我还创建了另一个应用程序,只包含上面的代码...那个应用程序工作得很好。所以我不确定我现有应用程序中的某些操作是否会影响firebase?但是,我不确定那可能是什么,因为我还将所有依赖项放入简单项目中。
你有什么想法可以检查下一步吗?
更新:我按建议添加了onComplete Listener,但它从未被调用。如果我在setValue()之后添加FirebaseDatabase.purgeOutstandingWrites(),则onComplete将带有以下错误被调用:
DatabaseError: The write was canceled by the user.

首先要做的是为 setValue() 添加完成处理程序,以查看它是否以错误结束。这将使您能够记录数据库报告的任何潜在问题(例如,记录到 logcat 中)。请参见 https://firebase.google.com/docs/database/android/save-data#receive_a_completion_callback - Frank van Puffelen
更正之前的评论(现已删除)。onComplete根本没有被调用。请参见主要问题中的更新。 - Innova
这最后一部分听起来像是您没有与数据库的连接。您的应用程序启用了磁盘持久性吗?如果是,请尝试禁用它,看看是否会有变化。 - Frank van Puffelen
我没有启用磁盘持久化。我添加了它,但它似乎表现出相同的方式。 - Innova
2个回答

3

我刚刚弄清楚了。认为我的两个项目之间存在差异是一个误导,实际的区别在于我部署这两个项目的设备不同。工作良好的设备使用蜂窝连接,而未能正常工作的设备则位于我们公司WiFi网络的代理后面。

我已经在设备上正确设置了代理,可以访问外部网站,但是看起来 Firebase 没有使用代理设置来源

如果 Firebase 可以使用设备代理设置就太好了!


0

需要注意的是,如果您正在保存自定义类,则需要为要保存在Firebase中的对象设置getter和setter。如果没有设置,那些没有getter和setter的对象将无法保存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接