【问题标题】:String to Localdate DateTimeParseException字符串到 Localdate DateTimeParseException
【发布时间】:2018-11-12 14:38:43
【问题描述】:

我正在从 SQLite 数据库加载一个字符串,然后尝试将其转换为 LocalDate 以便我可以将其添加为对象参数,然后比较列表中对象的日期。

但应用程序崩溃并给出 DateTimeParseException。

这是崩溃的方法,它在我创建 LocalDate 的那一行崩溃。

我在这个网站和其他网站上发现并阅读了许多类似的主题,但遗憾的是我无法弄清楚到底是什么问题。

private void fillEventsArray(){
    Cursor data = mDatabaseHelper.getData();
    while(data.moveToNext()){
        String name = data.getString(1);
        String description = data.getString(2);
        String time = data.getString(3);
        String date = data.getString(4);

        LocalDate localDate= LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy/MM/dd"));

        LocalTime localTime=LocalTime.parse(time, DateTimeFormatter.ofPattern("HH:mm"));

        Event event = new Event(name, description, localTime, localDate);

        events.add(event);
    }

我正在以相同的“yyyy/mm/dd”格式保存第 4 列中的数据,例如 2018/11/20。

之前我也尝试过像这样将字符串转换为 LodalDate/LocalTime,但遇到了同样的问题:

                String year=date.substring(0,4);
                String month=date.substring(5,7);
                String day=date.substring(8,10);
                LocalDate localDate=LocalDate.of(Integer.parseInt(year),Integer.parseInt(month),Integer.parseInt(day));
                String hour=time.substring(0,3);
                String minute=time.substring(4,5);
                LocalTime localTime=LocalTime.of(Integer.parseInt(hour),Integer.parseInt(minute));

如果数据库为空,是否会报错?

如果需要更多信息,请告诉我,我会提供。

Logcat 副本:

2018-11-12 15:48:57.836 12038-12038/com.example.dflavio.calendar E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.dflavio.calendar, PID: 12038
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.dflavio.calendar/com.example.dflavio.calendar.MainActivity}: java.time.format.DateTimeParseException: Text 'android.support.v7.widget.AppCompatEditText{ceb966d VFED..CL. .F...' could not be parsed at index 0
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
    at android.os.Handler.dispatchMessage(Handler.java:105)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
 Caused by: java.time.format.DateTimeParseException: Text 'android.support.v7.widget.AppCompatEditText{ceb966d VFED..CL. .F...' could not be parsed at index 0
    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1948)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
    at java.time.LocalDate.parse(LocalDate.java:394)
    at com.example.dflavio.calendar.MainActivity.fillEventsArray(MainActivity.java:104)
    at com.example.dflavio.calendar.MainActivity.onCreate(MainActivity.java:45)
    at android.app.Activity.performCreate(Activity.java:6975)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) 
    at android.app.ActivityThread.-wrap11(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) 
    at android.os.Handler.dispatchMessage(Handler.java:105) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6541) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

正如有人指出的那样,我在如何从编辑文本中获取字符串时可能犯了一个错误。目前代码是这样的:

createBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                EditText nameEditText = (EditText) findViewById(R.id.nameEditText);
                EditText descriptionEditText = (EditText) findViewById(R.id.descriptionEditText);
                EditText timeEditText = (EditText) findViewById(R.id.timeEditText);
                EditText dateEditText = (EditText) findViewById(R.id.dateEditText);

            String name = nameEditText.getText().toString();
            String description = descriptionEditText.getText().toString();
            String time = timeEditText.getText().toString();
            String date = dateEditText.getText().toString();
            if (name.length() != 0){
                if (description.length() != 0){
                    if (time.length() != 0){
                        if (date.length() != 0){
                            AddData(name, description, time, date);
                            nameEditText.setText("");
                            descriptionEditText.setText("");
                            timeEditText.setText("");
                            dateEditText.setText("");
                        }
                    }
                }
            }else{
                toastMessage("Fill in all fields.");
            }

提前感谢您的帮助。

【问题讨论】:

  • 日期和时间在数据库中的存储格式是什么?你有一些示例值吗?
  • 你能给出确切的例外吗?它应该包含一些指示错误的信息。
  • @EamonScullion 不太清楚你的意思。在这种方法之前,我一直只使用字符串。我基本上复制了他们在名为“将数据保存到 SQLite 数据库 [Beginner Android Studio Example]”的 youtube 视频中的做法。
  • @Henry 使用 logcat 副本更新帖子。
  • 能否贴出与设置EditText相关的代码?

标签: java android


【解决方案1】:

您的数据库似乎包含垃圾;您尝试将“android.support.v7.widget.AppCompatEditText{ceb966d VFED..CL..F...”之类的字符串解析为日期。

【讨论】:

  • 更新了我的帖子,提供了您评论的相关信息。
  • 我已经对代码进行了更改(也在我的帖子中更新了它),但应用程序仍然崩溃并显示相同的错误消息。
【解决方案2】:

我现在在猜测,但是当您将此日期值从 EditText 保存到数据库时,您是否做了类似的事情:

edittext.toString()

而不是

edittext.getText().toString()

如果是这种情况,请进行更改,因为您保存的不是 EditText 的文本"android.support.v7.widget.AppCompatEditText{ceb966d VFED..CL. .F...

【讨论】:

  • 我已经对代码进行了更改(也在我的帖子中更新了它),但应用程序仍然崩溃并显示相同的错误消息。
  • @D_Flavio 您已在代码中进行了更改,但数据库仍包含无效值。从模拟器/设备上卸载应用程序,以便删除数据库或从表中删除所有行,再次运行应用程序,重新填充表,然后尝试。
  • 进入“查看”->“工具窗口”->“设备文件资源管理器”->从数据文件夹中删除数据库是否有效?
  • 是的,虽然卸载应用更容易。
  • 我实际上不知道从模拟器中卸载应用程序是如何工作的。我已经完成了数据库删除并且它工作了,但只是为了了解更多如何从模拟器中卸载应用程序?
【解决方案3】:

您通过调用 nameEditText.toString() 错误地从您的编辑文本中检索文本,这将尝试将 EditText 对象转换为字符串,正如您从解析错误中看到的那样。

您应该调用nameEditText.getText().toString(),它将从对象中获取输入文本作为字符串。

【讨论】:

  • 我已经对代码进行了更改(也在我的帖子中更新了它),但应用程序仍然崩溃并显示相同的错误消息。
  • 如果您可以在fillEventsArray 方法中添加断点并进行调试,以查看data 在尝试解析时的值是什么
  • 另一件事要尝试,您可以通过将db.execSQL("DROP TABLE IF EXISTS" + TABLE_NAME); 添加到您的onCreate 方法来确保您的数据库在运行应用程序时重置(在创建表之前将其添加为第一行);
【解决方案4】:

错误在于您的代码读取编辑文本:

timeEditText.toString(); 替换为timeEditText.getText().toString();

【讨论】:

  • 我已经对代码进行了更改(也在我的帖子中更新了它),但应用程序仍然崩溃并显示相同的错误消息。
  • 当您尝试将“2018-11-12”之类的内容转换为 long 时,“/”或“-”不会导致问题吗?
  • 通过 SimpleDateFormat("yyyy/MM/dd").parse("2018/11/12"); 解析日期然后获取日期对象的unix时间(长)。
猜你喜欢
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多