Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Firebase实时数据库中保存本地数据?_Firebase_Kotlin_Firebase Realtime Database_Localdate - Fatal编程技术网

如何在Firebase实时数据库中保存本地数据?

如何在Firebase实时数据库中保存本地数据?,firebase,kotlin,firebase-realtime-database,localdate,Firebase,Kotlin,Firebase Realtime Database,Localdate,我是一个非常新的使用Kotlin和编程的人,目前我正在制作一个包含事件的日历。当我想将这些事件连接到firebase时,我的问题就来了 我使用的是在git()中找到的一个示例,它使用ThreeTen库来表示日期。这是事件对象: class Event (val id: String, val text: String, val date: LocalDate) : Serializable 数据变量是LocalData类型,这就是导致我出现问题的原因,因为Firebase似乎只接受String

我是一个非常新的使用Kotlin和编程的人,目前我正在制作一个包含事件的日历。当我想将这些事件连接到firebase时,我的问题就来了

我使用的是在git()中找到的一个示例,它使用ThreeTen库来表示日期。这是事件对象:

class Event (val id: String, val text: String, val date: LocalDate) : Serializable
数据变量是LocalData类型,这就是导致我出现问题的原因,因为Firebase似乎只接受String、Int等类型的变量

我试图用toString和Gson()将变量传递给String,但没有成功

如果有帮助,下面是代码

 private val inputDialog by lazy {
    val editText = AppCompatEditText(requireContext())
    val layout = FrameLayout(requireContext()).apply {
        // Setting the padding on the EditText only pads the input area
        // not the entire EditText so we wrap it in a FrameLayout.
        setPadding(20, 20, 20, 20)
        addView(editText, FrameLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT))
    }
    AlertDialog.Builder(requireContext())
        .setTitle(getString(R.string.example_3_input_dialog_title))
        .setView(layout)
        .setPositiveButton(R.string.save) { _, _ ->
            saveEvent(editText.text.toString())
            // Prepare EditText for reuse.
            editText.setText("")
        }
        .setNegativeButton(R.string.close, null)
        .create()
        .apply {
            setOnShowListener {
                // Show the keyboard
                editText.requestFocus()
                context.inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)
            }
            setOnDismissListener {
                // Hide the keyboard
                context.inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0)
            }
        }
}
private var selectedDate: LocalDate? = null
private val today = LocalDate.now()
private val titleSameYearFormatter = DateTimeFormatter.ofPattern("MMMM")
private val titleFormatter = DateTimeFormatter.ofPattern("MMM yyyy")
private val selectionFormatter = DateTimeFormatter.ofPattern("yyyy MM dd")
private val events = mutableMapOf<LocalDate, List<Event>>()
private var prueba = Gson().toJson(events)
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    return inflater.inflate(R.layout.fragment_calendar, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    mDatabaseReference = mDatabase!!.reference.child("events")
    exThreeRv.layoutManager = LinearLayoutManager(requireContext(), RecyclerView.VERTICAL, false)
    exThreeRv.adapter = eventsAdapter
    exThreeRv.addItemDecoration(DividerItemDecoration(requireContext(), RecyclerView.VERTICAL))
    val daysOfWeek = daysOfWeekFromLocale()
    val currentMonth = YearMonth.now()
    exThreeCalendar.setup(currentMonth.minusMonths(10), currentMonth.plusMonths(10), daysOfWeek.first())
    exThreeCalendar.scrollToMonth(currentMonth)
    if (savedInstanceState == null) {
        exThreeCalendar.post {
            // Show today's events initially.
            selectDate(today)
        }
    }
    class DayViewContainer(view: View) : ViewContainer(view) {
        lateinit var day: CalendarDay // Will be set when this container is bound.
        val textView = view.exThreeDayText
        val dotView = view.exThreeDotView
        init {
            view.setOnClickListener {
                if (day.owner == DayOwner.THIS_MONTH) {
                    selectDate(day.date)
                }
            }
        }
    }
    exThreeCalendar.dayBinder = object : DayBinder<DayViewContainer> {
        override fun create(view: View) = DayViewContainer(view)
        override fun bind(container: DayViewContainer, day: CalendarDay) {
            container.day = day
            val textView = container.textView
            val dotView = container.dotView
            textView.text = day.date.dayOfMonth.toString()
            if (day.owner == DayOwner.THIS_MONTH) {
                textView.makeVisible()
                when (day.date) {
                    today -> {
                        textView.setTextColorRes(R.color.white)
                        textView.setBackgroundResource(R.drawable.today_bg)
                        dotView.makeInVisible()
                    }
                    selectedDate -> {
                        textView.setTextColorRes(R.color.white)
                        textView.setBackgroundResource(R.drawable.selected_bg)
                        dotView.makeInVisible()
                    }
                    else -> {
                        textView.setTextColorRes(R.color.black)
                        textView.background = null
                        dotView.isVisible = events[day.date].orEmpty().isNotEmpty()
                    }
                }
            } else {
                textView.makeInVisible()
                dotView.makeInVisible()
            }
        }
    }
    exThreeCalendar.monthScrollListener = {
        requireActivity().home.text = if (it.year == today.year) {
            titleSameYearFormatter.format(it.yearMonth)
        } else {
            titleFormatter.format(it.yearMonth)
        }
        // Select the first day of the month when
        // we scroll to a new month.
        selectDate(it.yearMonth.atDay(1))
    }
    class MonthViewContainer(view: View) : ViewContainer(view) {
        val legendLayout = view.legendLayout
    }
    exThreeCalendar.monthHeaderBinder = object : MonthHeaderFooterBinder<MonthViewContainer> {
        override fun create(view: View) = MonthViewContainer(view)
        override fun bind(container: MonthViewContainer, month: CalendarMonth) {
            // Setup each header day text if we have not done that already.
            if (container.legendLayout.tag == null) {
                container.legendLayout.tag = month.yearMonth
                container.legendLayout.children.map { it as TextView }.forEachIndexed { index, tv ->
                    tv.text = daysOfWeek[index].name.first().toString()
                    tv.setTextColorRes(R.color.black)
                }
            }
        }
    }
    exThreeAddButton.setOnClickListener {
        inputDialog.show()
    }
}
private fun selectDate(date: LocalDate) {
    if (selectedDate != date) {
        val oldDate = selectedDate
        selectedDate = date
        oldDate?.let { exThreeCalendar.notifyDateChanged(it) }
        exThreeCalendar.notifyDateChanged(date)
        updateAdapterForDate(date)
    }
}
private fun saveEvent(text: String) {
    if (text.isBlank()) {
        Toast.makeText(requireContext(),
            R.string.example_3_empty_input_text, Toast.LENGTH_LONG).show()
    } else {
        selectedDate?.let {
            events[it] = events[it].orEmpty().plus(
                Event(
                    UUID.randomUUID().toString(),
                    text,
                    it
                )
            )
            uploadFirebase()
            updateAdapterForDate(it)
        }
    }
}
private fun deleteEvent(event: Event) {
    val date = event.date
    events[date] = events[date].orEmpty().minus(event)
    updateAdapterForDate(date)
}
private fun updateAdapterForDate(date: LocalDate) {
    eventsAdapter.events.clear()
    eventsAdapter.events.addAll(events[date].orEmpty())
    eventsAdapter.notifyDataSetChanged()
    exThreeSelectedDateText.text = selectionFormatter.format(date)
}

fun uploadFirebase(){
    val newEvent = mDatabaseReference.push()
    newEvent.setValue(events)
}


override fun onStart() {
    super.onStart()
}
override fun onStop() {
    super.onStop()
}
惰性的私有val输入对话框{ val editText=AppCompativeText(requireContext()) val layout=FrameLayout(requireContext())。应用{ //在EditText上设置填充仅填充输入区域 //不是整个EditText,所以我们将其包装在FrameLayout中。 设置填充(20,20,20,20) addView(editText、FrameLayout.LayoutParams(匹配父项、换行内容)) } AlertDialog.Builder(requireContext()) .setTitle(getString(R.string.example_3_input_dialog_title)) .setView(布局) .setPositiveButton(R.string.save){{},{-> saveEvent(editText.text.toString()) //准备编辑文本以供重用。 editText.setText(“”) } .setNegativeButton(R.string.close,null) .create() .申请{ SETONSHOWLISTER{ //显示键盘 editText.requestFocus() context.inputMethodManager.toggleSoftInput(inputMethodManager.SHOW\u强制,0) } setOnDismissListener{ //隐藏键盘 context.inputMethodManager.toggleSoftInput(仅inputMethodManager.HIDE\u隐式\u,0) } } } 私有变量selectedDate:LocalDate?=无效的 private val today=LocalDate.now() private val titleSameYearFormatter=模式的DateTimeFormatter.of(“MMMM”) private val titleFormatter=DateTimeFormatter.of模式(“MMM yyyy”) private val selectionFormatter=DateTimeFormatter.of模式(“yyyy-MM-dd”) private val events=mutableMapOf() 私有变量prueba=Gson().toJson(事件) 覆盖创建视图(充气机:布局充气机,容器:ViewGroup?,savedInstanceState:Bundle?):视图?{ 返回充气机。充气(R.layout.fragment_日历,容器,假) } 覆盖已创建的视图(视图:视图,保存状态:捆绑?){ super.onViewCreated(视图,savedInstanceState) mDatabaseReference=mDatabase!!.reference.child(“事件”) exThreeRv.layoutManager=LinearLayoutManager(requireContext(),RecyclerView.VERTICAL,false) exThreeRv.adapter=eventsAdapter exThreeRv.addItemDecoration(DividerItemDecoration(requireContext(),RecyclerView.VERTICAL)) val daysOfWeek=daysOfWeekFromLocale() val currentmount=YearMonth.now() exThreeCalendar.setup(currentmount.minusMonths(10)、currentmount.plusMonths(10)、daysOfWeek.first()) exThreeCalendar.scrollToMonth(当前月) 如果(savedInstanceState==null){ exThreeCalendar.post{ //首先展示今天的活动。 选择日期(今天) } } 类DayViewContainer(视图:视图):ViewContainer(视图){ 绑定此容器时,将设置lateinit var day:CalendarDay//。 val textView=view.exThreeDayText val dotView=view.exThreeDotView 初始化{ view.setOnClickListener{ if(day.owner==本月的DayOwner){ 选择日期(day.date) } } } } exThreeCalendar.dayBinder=对象:dayBinder{ 覆盖乐趣创建(视图:视图)=DayViewContainer(视图) 覆盖乐趣绑定(容器:DayViewContainer,日期:CalendarDay){ container.day=天 val textView=container.textView val dotView=container.dotView textView.text=day.date.dayOfMonth.toString() if(day.owner==本月的DayOwner){ textView.makeVisible() 时间(日期){ 今天->{ textView.setTextColorRes(R.color.white) textView.setBackgroundResource(R.drawable.today_bg) dotView.makeInVisible() } 选定日期->{ textView.setTextColorRes(R.color.white) textView.setBackgroundResource(R.drawable.selected\u bg) dotView.makeInVisible() } 其他->{ textView.setTextColorRes(R.color.black) textView.background=null dotView.isVisible=事件[day.date].orEmpty().isNotEmpty() } } }否则{ textView.makeInVisible()文件 dotView.makeInVisible() } } } exThreeCalendar.monthScrollListener={ requirement().home.text=if(it.year==today.year){ titleSameYearFormatter.format(it.yearMonth) }否则{ titleFormatter.format(it.yearMonth) } //选择月份的第一天 //我们滚动到新的一个月。 选择日期(it.yearMonth.atDay(1)) } 类MonthViewContainer(视图:视图):ViewContainer(视图){ val legendLayout=view.legendLayout } exThreeCalendar.monthHeaderBinder=object:MonthHeaderFooterBinder{ 覆盖乐趣创建(视图:视图)=MonthViewContainer(视图) 覆盖乐趣绑定(容器:MonthViewContainer,月:日历月){ //设置每个标题日文本(如果我们还没有这样做)。 if(container.legendLayout.tag==null){ container.legendLayout.tag=month.yearMonth 康泰