在 Android 中从 firebase 获取日历

三木

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

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Android:如何在 YEAR/MONTH/DATE Spinners 中获取日历

通过Java中的日历功能获取负值(Android)

如何从Android中的Firebase获取对象?

在Firebase中获取Android Studio的密钥

如何从Android中的Firebase获取列表的值?

如何从android studio的firebase中获取孩子?

在Firebase Android中获取插入对象的密钥

在android firebase中获取父节点

Android日历,获取事件ID

如何在Android中从Cloud Firestore Firebase获取或获取数据

在Exchange中获取日历项目

如何在 android 8.1 版中获取日历电子邮件 ID?

我们可以在android api 8中获取本机日历视图吗?

在Android Studio中获取和设置Firebase实例的值

如何在 Firebase for Android 中获取根节点的子节点

如何从Firebase Android中的用户对象获取用户对象

如何在jsonarray firebase android中获取对象?

Android Studio - 从 Firebase 数据库中获取特定词

无法在 Android Firebase 中获取上传文件的下载 URL

从Firebase Android中的子节点获取父节点

使用Firebase在Android中推送通知获取令牌

在firebase android中获取特定值的推送ID

使用Firebase-Android中的orderByChild-equalsTo获取孩子

接收推送Android(firebase)时如何从通知中获取数据?

如何在 android 活动中获取 Firebase 令牌?

Firebase在Android中以编程方式获取子值索引

Android,从 firebase 数据库中获取价值

如何在android中从Firebase获取子节点的子节点?

如何使用firebase在android中获取特定值的推送ID