如何在Firebase实时数据库中保存本地数据?
我是一个非常新的使用Kotlin和编程的人,目前我正在制作一个包含事件的日历。当我想将这些事件连接到firebase时,我的问题就来了 我使用的是在git()中找到的一个示例,它使用ThreeTen库来表示日期。这是事件对象:如何在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
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
康泰