You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android项目中Firebase实时数据库事件无法读取显示的问题

Firebase实时数据库日历事件加载失败问题排查

问题场景

预期流程:

  • 用户在Calendar View选择日期
  • 在EditText输入事件内容
  • 点击按钮将事件保存至Firebase实时数据库
  • 再次点击已保存事件的日期时,EditText自动显示对应事件

实际问题:点击已保存事件的日期后,EditText无内容显示,调整数据库规则后仍未解决。

附MainActivity代码

public class MainActivity extends AppCompatActivity {

    FirebaseAuth auth;
    TextView textViewLogOut, user_details, kalkulacka_go;
    FirebaseUser user;
    DatabaseReference mDatabase;
    CalendarView calendarView;
    EditText editTextEvent;
    Button buttonSave;
    FirebaseUser mCurrentUser;

    String stringDateSelected;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        auth = FirebaseAuth.getInstance();
        textViewLogOut = findViewById(R.id.textViewLogOut);
        user_details = findViewById(R.id.user_details);
        kalkulacka_go = findViewById(R.id.kalkulacka_go);
        user = auth.getCurrentUser();

        calendarView = findViewById(R.id.calendarView);
        editTextEvent = findViewById(R.id.editTextEvent);
        buttonSave = findViewById(R.id.buttonSave);

        mCurrentUser = FirebaseAuth.getInstance().getCurrentUser();
        mDatabase = FirebaseDatabase.getInstance().getReference("Calendar");
        String userId = user.getUid();

        calendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
            @Override
            public void onSelectedDayChange(@NonNull CalendarView calendarView, int year, int month, int dayOfMonth) {
                Calendar calendar = Calendar.getInstance();
                calendar.set(year, month, dayOfMonth);
                long selectedDate = calendar.getTimeInMillis();

                // get event for selected date from Firebase Realtime Database
                String key = String.valueOf(selectedDate);
                DatabaseReference eventRef = mDatabase.child("events").child(userId).child(key);
                eventRef.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                        // set editText text to event for selected date, or "Please input event" if no event is found
                        String event = snapshot.getValue(String.class);
                        if (event != null) {
                            editTextEvent.setText(event);
                        } else {
                            editTextEvent.setText("Please input event");
                        }
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError error) {
                        // handle error
                    }
                });
            }
        });

        buttonSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                long selectedDate = calendarView.getDate();

                // get event from editText
                String event = editTextEvent.getText().toString().trim();

                // save event for selected date to Firebase Realtime Database
                String key = String.valueOf(selectedDate);
                DatabaseReference eventRef = mDatabase.child("events").child(userId).child(key);
                eventRef.setValue(event);
                }
        });

        if(user == null){
            Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
            startActivity(intent);
            finish();
        }

        else{
            user_details.setText(user.getEmail());
        }

        textViewLogOut.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                FirebaseAuth.getInstance().signOut();
                Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
                startActivity(intent);
                finish();
            }
        });

        kalkulacka_go.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(), CalculatorActivity.class);
                startActivity(intent);
                finish();
            }
        });
    }
}

问题根源及解决方法

1. 时间戳生成不一致(核心问题)

保存事件时使用calendarView.getDate()获取的是选中日期当天0点整的时间戳;但加载事件时,手动构建Calendar对象仅设置年月日,未清除时分秒,导致生成的时间戳包含当前时间的时分秒,与保存时的时间戳不匹配,因此找不到对应数据。

解决:统一时间戳生成逻辑
添加工具方法生成当天0点的时间戳:

private long getDayStartTimestamp(int year, int month, int dayOfMonth) {
    Calendar calendar = Calendar.getInstance();
    calendar.set(year, month, dayOfMonth, 0, 0, 0);
    calendar.set(Calendar.MILLISECOND, 0);
    return calendar.getTimeInMillis();
}

修改加载事件的代码:

@Override
public void onSelectedDayChange(@NonNull CalendarView calendarView, int year, int month, int dayOfMonth) {
    long selectedDate = getDayStartTimestamp(year, month, dayOfMonth);
    // 后续数据库读取逻辑不变
}

修改保存事件的代码(确保时间戳统一):

buttonSave.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(calendarView.getDate());
        long selectedDate = getDayStartTimestamp(
            calendar.get(Calendar.YEAR),
            calendar.get(Calendar.MONTH),
            calendar.get(Calendar.DAY_OF_MONTH)
        );
        // 后续数据库保存逻辑不变
    }
});

2. 缺失错误日志排查

onCancelled方法未添加错误日志,无法排查数据库权限、连接等问题。

解决:添加错误日志

@Override
public void onCancelled(@NonNull DatabaseError error) {
    Log.e("FirebaseCalendar", "读取事件失败:" + error.getMessage());
}

3. 验证数据库路径

登录Firebase控制台,确认数据存储路径为Calendar/events/{用户UID}/{时间戳},避免路径层级错误。

内容的提问来源于stack exchange,提问作者maniacwithnoskill

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 12:59:56