Получение календаря из firebase в Android - PullRequest
0 голосов
/ 17 июня 2020

Я создаю приложение-календарь, но мне не удается заставить работать серверную часть. Я могу сохранять / удалять и редактировать свои события, но не могу заставить их отображаться, когда пользователь нажимает на календарь. Пользователи могут просматривать свои сохраненные данные, когда они вносят изменения на экране, но как только они перезапускают приложение или щелкают по другим представлениям, все исчезает. Я проверил содержимое своего списка, и детали всегда отображаются как null.

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)

1 Ответ

0 голосов
/ 17 июня 2020

Вы получаете следующее исключение:

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

Потому что вы пытаетесь привести объект типа HashMap к объекту типа Calendar. На самом деле это невозможно в Java, потому что между ними нет отношения наследования. Как я вижу в сообщении об ошибке, вы пытаетесь выполнить приведение в методе onDataChange(). Таким образом, объект DataSnapshot фактически содержит HashMap, а не объект Calendar. Кроме того, Календарь не поддерживаемый тип данных в базе данных Firebase Realtime.

Чтобы решить эту проблему, попробуйте получить данные из объекта HashMap, путем перебора его элементов. Кроме того, измените тип своего свойства mDate на тип HashMap и не календарь в вашем классе CalenderEventModel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...