java - 在 Android 中从 firebase 获取日历

标签 java android firebase firebase-realtime-database

我正在构建一个日历应用程序,但我无法让后端正常工作。 我可以保存/删除和编辑我的事件,但当用户单击日历时无法显示它们。用户可以在屏幕上进行更改时查看保存的数据,但一旦重新启动应用程序或单击其他 View ,所有内容都会消失。我检查了我的列表内容,详细信息始终显示为空。

public class CalendarViewWithNotesActivitySDK21_v2 extends Fragment {

private final static int CREATE_EVENT_REQUEST_CODE = 100;

private String[] mShortMonths;
private CalendarView mCalendarView;
private CalendarDialog mCalendarDialog;

private List<CalenderEventModel> mEventList = new ArrayList<>();

private static Context context = null;

public static Intent makeIntent(Context context) {
    return new Intent(context, CalendarViewWithNotesActivitySDK21_v2.class);
}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    context = getActivity();
    setHasOptionsMenu(true);
    View v = inflater.inflate(R.layout.activity_calendar_view_with_notes_sdk_21, container, false);

    //getFirebaseData();

    //mShortMonths = new DateFormatSymbols().getShortMonths();

    initializeUI(v);

    return v;
}

private void getFirebaseData() {
    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    assert user != null;
    final String uid = user.getUid();
    final FirebaseDatabase db = FirebaseDatabase.getInstance();
    final DatabaseReference ref = db.getReference("Calendar Events").child(uid);

    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            mEventList.clear();
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                String id = ds.getKey();
                String title = ds.child("title").getValue(String.class);
                Calendar date = ds.child("date").getValue();
                int color = ds.child("color").getValue(Integer.class);
                boolean complete = ds.child("completed").getValue(boolean.class);

                CalenderEventModel model = new CalenderEventModel(id,title,date,color,complete);
                mEventList.add(model);

                //mEventList.add(ds.getValue(CalenderEventModel.class));
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

}

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

    getFirebaseData();

    mShortMonths = new DateFormatSymbols().getShortMonths();

    //initializeUI();
}

这就是我保存到 firebase 的方式

 private void save() {

    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    assert user != null;
    final String uid = user.getUid();
    final FirebaseDatabase database = FirebaseDatabase.getInstance();
    final DatabaseReference ref = database.getReference("Calendar Events").child(uid);
    String key = ref.push().getKey();

    int action = mOriginalEvent != null ? ACTION_EDIT : ACTION_CREATE;
    String id = mOriginalEvent != null ? mOriginalEvent.getID() : key;
    String rawTitle = mTitleView.getText().toString().trim();

    if(mOriginalEvent == null) {
        mOriginalEvent = new CalenderEventModel(
                id,
                rawTitle.isEmpty() ? null : rawTitle,
                mCalendar,
                mColor,
                mIsCompleteCheckBox.isChecked()
        );
        Map<String, Object> childUpdate = new HashMap<>();
        childUpdate.put(key, mOriginalEvent.toFirebaseObject());
        ref.updateChildren(childUpdate, new DatabaseReference.CompletionListener() {
            @Override
            public void onComplete(@Nullable DatabaseError databaseError, @NonNull DatabaseReference databaseReference) {
                if (databaseError == null) {
                    return;
                }
            }
        });
    } else {
        mOriginalEvent.setmTitle(rawTitle.isEmpty() ? null : rawTitle);
        mOriginalEvent.setmDate(mCalendar);
        mOriginalEvent.setmColor(mColor);
        mOriginalEvent.setCompleted(mIsCompleteCheckBox.isChecked());
        ref.child(mOriginalEvent.getID()).setValue(mOriginalEvent);
    }

    setResult(RESULT_OK, new Intent()
            .putExtra(INTENT_EXTRA_ACTION, action)
            .putExtra(INTENT_EXTRA_EVENT, mOriginalEvent));
    finish();

    if (action == ACTION_CREATE)
        overridePendingTransition(R.anim.stay, R.anim.slide_out_down);

}

这是我的事件模式类

public class CalenderEventModel implements Parcelable {

private String mID;
private String mTitle;
private Calendar mDate;
private int mColor;
private boolean isCompleted;

public CalenderEventModel() {

}

public CalenderEventModel(String id, String title, Calendar date, int color, boolean isCompleted) {
    mID = id;
    mTitle = title;
    mDate = date;
    mColor = color;
    this.isCompleted = isCompleted;
}

public void setmID(String mID) {
    this.mID = mID;
}

public void setmTitle(String mTitle) {
    this.mTitle = mTitle;
}

public void setmDate(Calendar mDate) {
    this.mDate = mDate;
}

public void setmColor(int mColor) {
    this.mColor = mColor;
}

public void setCompleted(boolean completed) {
    isCompleted = completed;
}

public String getID() {
    return mID;
}

public String getTitle() {
    return mTitle;
}

public Calendar getDate() {
    return mDate;
}

public int getColor() {
    return mColor;
}

public boolean isCompleted() {
    return isCompleted;
}

public Map<String, Object> toFirebaseObject() {
    HashMap<String, Object> event = new HashMap<>();
    event.put("mid", mID);
    event.put("title", mTitle);
    event.put("date", mDate);
    event.put("color", mColor);
    event.put("completed", isCompleted);

    return event;
}

protected CalenderEventModel(Parcel in) {
    mID = in.readString();
    mTitle = in.readString();
    mColor = in.readInt();
    mDate = (Calendar) in.readSerializable();
    isCompleted = in.readByte() != 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(mID);
    dest.writeString(mTitle);
    dest.writeInt(mColor);
    dest.writeSerializable(mDate);
    dest.writeByte((byte) (isCompleted ? 1 : 0));
}

@Override
public int describeContents() {
    return 0;
}

public static final Creator<CalenderEventModel> CREATOR = new Creator<CalenderEventModel>() {
    @Override
    public CalenderEventModel createFromParcel(Parcel in) {
        return new CalenderEventModel(in);
    }

    @Override
    public CalenderEventModel[] newArray(int size) {
        return new CalenderEventModel[size];
    }
};

}

在获取 firebase 数据的方法中,我尝试一一获取数据,如未注释的语句中所示,但我遇到了此错误

java.lang.ClassCastException: java.util.HashMap cannot be cast to java.util.Calendar
    at com.example.serenity.CalendarViewWithNotesActivitySDK21_v2$1.onDataChange(CalendarViewWithNotesActivitySDK21_v2.java:91)
    at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@19.3.0:75)
    at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@19.3.0:63)
    at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@19.3.0:55)
    at android.os.Handler.handleCallback(Handler.java:907)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:223)
    at android.app.ActivityThread.main(ActivityThread.java:7478)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941)

最佳答案

您收到以下异常:

java.lang.ClassCastException: java.util.HashMap cannot be cast to java.util.Calendar

因为您试图将 HashMap 类型的对象转换为 Calendar 类型的对象。这在Java中其实是不可能的,因为它们之间没有继承关系。正如我在错误消息中看到的,您正在尝试在 onDataChange() 方法中进行转换。因此,DataSnapshot 对象实际上包含一个 HashMap,而不是一个 Calendar 对象。除此之外,the Calendar is not a supported data-type在 Firebase 实时数据库中。

要解决此问题,请尝试通过迭代其元素来从 HashMap 对象中获取数据。另外,将 mDate 属性的类型更改为 HashMap 类型,而不是 CalenderEventModel 类中的日历类型。

关于java - 在 Android 中从 firebase 获取日历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62422922/

相关文章:

java - 使用 getBinaryStream 读取单元格

java - Spring 中未找到默认构造函数

java - 为什么我的 'userID' 初始化为 0 而不是从 PHP 发送的内容?

android - Android drawable的clip-path层可以旋转吗?

java - 创建通用数据类型的链表,但所有节点在 Java 中应具有相同的数据类型

java - Swing Dynamical JCombobox 检测用户的选择更改

java - Android Studio 启动 - MaxJavaStackTraceDepth = -1 超出允许范围 - 错误

reactjs - 无法设置状态 Firestore 数据

ANGULAR 如何推送到可观察数组?英雄 : Observable<Hero[]>

javascript - Firestore : Unable to read document data (Uncaught TypeError: docSnap. 存在不是 HTMLFormElement 的函数)