如何将 DatePickerDialog 中的选定日期存储到 Room Persistence Library (Java-Android Studio)

问题描述

我正在尝试将 DatePickerDialog 中的选定日期作为字符串存储到 Android Studio 中的 Room 中。 我在网上找到的关于将 Date 存储到 Room 的资源都涉及 typeConverter,我不明白如何。 所以我尝试在 saveMood() 方法中使用 toString() 来做,但它不起作用

在 Activity 中声明的变量以及 DatePickerDialog:

public static final String EXTRA_DATE = "com.example.mood.EXTRA_DATE";
public static final String EXTRA_EMOJI = "com.example.mood.EXTRA_EMOJI";
public static final String EXTRA_JOURNAL = "com.example.mood.EXTRA_JOURNAL";

    private static final String TAG = "AddMoodActivity";

    private EditText pick_date,edit_emoji,edit_journal;
    private DatePickerDialog.OnDateSetListener onDateSetListener;

    Button btnDatePicker;

        @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_mood);

        pick_date = findViewById(R.id.pick_date);
        edit_emoji = findViewById(R.id.edit_emoji);
        edit_journal = findViewById(R.id.edit_journal_text);
        btnDatePicker = findViewById(R.id.btn_date);

        getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close);
        setTitle("Add New Mood Entry");

        //select Date
        btnDatePicker.setonClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                Calendar cal = Calendar.getInstance();
                int year = cal.get(Calendar.YEAR);
                int month = cal.get(Calendar.MONTH);
                int day = cal.get(Calendar.DAY_OF_MONTH);

                DatePickerDialog dialog = new DatePickerDialog(
                        AddMoodActivity.this,android.R.style.Theme_Holo_Light_Dialog_MinWidth,onDateSetListener,year,month,day);
                dialog.getwindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
                dialog.show();
            }
        });

        //set chosen date
        onDateSetListener = new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view,int year,int month,int dayOfMonth) {
                Log.d(TAG,"onDateSet: dd/mm/yyyy "+ dayOfMonth + "/" + month + "/" + year);
                month = month + 1;
                String selected_date = dayOfMonth + "/" + month + "/" + year;
                pick_date.setText(selected_date);
            }
        };
    }

保存条目的方法

    private void saveMood(){

        //NEED HELP WITH THIS PART
        //String date = pick_date.getText().toString();
        String emoji = edit_emoji.getText().toString();
        String journal_text = edit_journal.getText().toString();

        Intent data = new Intent();
        data.putExtra(EXTRA_DATE,pick_date);
        data.putExtra(EXTRA_EMOJI,emoji);
        data.putExtra(EXTRA_JOURNAL,journal_text);

        setResult(RESULT_OK,data);
        finish();
    }

解决方法

好的,首先日历 api 有点不可靠,Java 8 带有新的日期处理类,您可以通过添加 desugaring 轻松在所有 android 版本上使用(设置不像房间那么复杂)>

所以在我们创建一个日期对象之后(这样会更容易管理,因为它提供了保存到 utc 并在稍后阶段解析的方法)

onDateSetListener = new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view,int year,int month,int dayOfMonth) {
                Log.d(TAG,"onDateSet: dd/mm/yyyy "+ dayOfMonth + "/" + month + "/" + year);
                month = month + 1;

                //not sure if month indexes are the same here
                LocalDate date = LocalDate.of(year,month,dayOfMonth);

                //here you can format as you want
                String selected_date = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).format(date);
                pick_date.setText(selected_date);
                pick_date.setTag(date);
            }
        };

然后当您想使用类型转换器保存时(您也可以在需要时轻松地从视图的标签中检索日期对象)

你首先创建一个类

class DateConverter {
    @TypeConverter
   public LocalDate secondToDate(epochDay: Long) {
        return LocalDate.ofEpochDay(epochDay);
    }

    @TypeConverter
    public Long dateToSecond(date: LocalDate) {
        return date.toEpochDay();
    }
}

将其与您的实体链接

@Entity(tableName = "focus")
@TypeConverters(value = [DateConverter.class])
class FocusEntity extends ServerEntity {}

编译器将为您处理转换(我将这段代码从我写的旧 kotlin 代码转换过来,因此可能无法编译,但这是如何做到的一般想法)

date.toEpochDay() 允许您将数据保存为长值,然后使用 LocalDate.ofEpochDay() 恢复(可能只是忽略类型转换器部分)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...