在检查匹配的几个值并将我的数据插入这些对象后,我试图在 firebase 中插入数据。但它在数据插入之前运行良好,因为数据插入代码执行主 UI 线程停止并且在 firebase 实时数据库中开始无限插入。
这是代码:
final Schedule schedule = new Schedule(latestCalendar.getTimeInMillis(),String.valueOf(hourOfDay)+":"+String.valueOf(minute)+" - "+String.valueOf(hourOfDayEnd)+":"+String.valueOf(minuteEnd));
final HashMap<String, Object> teamMap = (HashMap<String, Object>) new ObjectMapper().convertValue(schedule, Map.class);
AppBaseActivity.firebaseDatabase.getReference().child("Users").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
final UserModel user = postSnapshot.getValue(UserModel.class);
AppBaseActivity.firebaseDatabase.getReference().child("Users").child(user.getUid()).child("Teams").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
final Team myTeam = postSnapshot.getValue(Team.class);
if (teamID.equals(myTeam.getTid())) {
final String tid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
// It goes infinite on this code
AppBaseActivity.firebaseDatabase.getReference().child("Users").child(user.getUid()).child("Teams").child(myTeam.getTid()).child("Schedule").child(tid).setValue(teamMap);
}
}
}
@Override
public void onCancelled(DatabaseError error) {
// Failed to read value
Toast.makeText(ScheduleTeam.this, getString(R.string.cancel), Toast.LENGTH_SHORT).show();
}
});
}
}
@Override
public void onCancelled(DatabaseError error) {
// Failed to read value
Toast.makeText(ScheduleTeam.this,getString(R.string.cancel),Toast.LENGTH_SHORT).show();
}
您的代码看起来非常复杂。请记住,附加侦听器/Users
会将所有用户读入您的 Android 应用程序。如果您只是在寻找一个特定的用户,加载所有这些用户会浪费 Android 设备的大量带宽和处理能力。通过使用查询,您最好只加载您需要的用户:
DatabaseReference users =
AppBaseActivity.firebaseDatabase.getReference().child("Users");
Query userQuery = users.orderByChild("tid").equalTo(teamID);
userQuery.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
final UserModel user = postSnapshot.getValue(UserModel.class);
for (DataSnapshot teamSnapshot: postSnapshot.child("Teams")
final Team myTeam = teamSnapshot.getValue(Team.class);
if (teamID.equals(myTeam.getTid())) {
final String tid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
teamSnapshot.getRef().child("Schedule").child(tid).setValue(teamMap);
}
});
}
}
@Override
public void onCancelled(DatabaseError error) {
Toast.makeText(ScheduleTeam.this,getString(R.string.cancel),Toast.LENGTH_SHORT).show();
}
一些变化:
tid
值相等的用户teamID
。Schedule
从快照构建到 的路径,而不是从根重建它。据我所知,此代码与您的代码相同。但是那里发生了一些事情,所以可能会有小错误。一般来说,我建议尝试理解我上面描述的 3 个更改,因为它们可能比复制/粘贴代码更有帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句