我正在构建一个日历应用程序,但我无法让后端工作。我可以保存/删除和编辑我的事件,但是当用户单击日历时我无法显示它们。用户可以在屏幕上进行更改时查看他们保存的数据,但是一旦他们重新启动应用程序或单击其他视图,一切都消失了。我检查了我的列表内容,详细信息始终显示为空。
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 数据的方法中,我尝试一一获取数据,如未注释的 out 语句中所示,但我面临此错误
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 对象。除此之外,日历不是Firebase 实时数据库中支持的数据类型。
要解决此问题,请尝试通过遍历其元素来从 HashMap 对象中获取数据。此外,将您的mDate
属性类型更改为HashMap 类型,而不是您CalenderEventModel
班级中的日历类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句