Android 应用中的数据未保存到 Firebase
Data not being saved to Firebase from Android App
我有一个现有的应用程序,我正在尝试将其转换为使用 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.
好吧,我刚刚弄明白了。认为我的两个项目之间存在差异是转移注意力。实际区别在于我将这两个项目部署到的两个设备之间。工作设备处于蜂窝连接状态。无法正常工作的设备位于代理后面的公司 wifi 网络上。
我在设备上正确设置了代理,我可以访问外部站点...但是,firebase 似乎没有使用代理设置 source。
如果 Firebase 使用设备代理设置就更好了!
请务必牢记,如果您要保存自定义 class,则需要为要保存在 firebase 中的对象设置 getter 和 setter。如果你不这样做,没有提供 getters 和 setters 的对象将不会被保存。
我有一个现有的应用程序,我正在尝试将其转换为使用 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.
好吧,我刚刚弄明白了。认为我的两个项目之间存在差异是转移注意力。实际区别在于我将这两个项目部署到的两个设备之间。工作设备处于蜂窝连接状态。无法正常工作的设备位于代理后面的公司 wifi 网络上。
我在设备上正确设置了代理,我可以访问外部站点...但是,firebase 似乎没有使用代理设置 source。
如果 Firebase 使用设备代理设置就更好了!
请务必牢记,如果您要保存自定义 class,则需要为要保存在 firebase 中的对象设置 getter 和 setter。如果你不这样做,没有提供 getters 和 setters 的对象将不会被保存。