gpt4 book ai didi

java - 当数据库更改时,前一个 String 键会发生 NumberFormatException

转载 作者:行者123 更新时间:2023-12-02 00:59:32 27 4
gpt4 key购买 nike

每次数据库中的值发生更改都会导致相关 Activity 停止工作。但再次启动 Activity 后,显示和检索的数据仍然有效并更新。

我在 Logcat 中找到了这个:

AndroidRuntime: FATAL EXCEPTION: main
java.lang.NumberFormatException: For input string: "201908241000gjjj"

这是数据库的字符串键:

//formatDateTime and parseDateTime are methods to simplify simpleDateFormat and return String
String stringDate = formatDateTime(dateFromString, "yyyyMMdd");
String stringTime = parseDateTime(taskTime, "hh:mm a", "HHmm");
final String key = stringDate + stringTime + taskParticipant;
dbrSchedule.child(key).setValue(schedule); //schedule is model class

我从不要求代码检索并将其解析为数字。 onCreate 内部:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

dbrCurrentTask.orderByChild("dateOrder").startAt(stringDateForWorkingInProgress).endAt(stringDateForCurrent).addValueEventListener(todayTasks);
}

private ValueEventListener todayTasks = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
scheduleList.clear();
for (DataSnapshot scheduleTaskDS : dataSnapshot.getChildren()) {
final ScheduleFD scheduleTemp = scheduleTaskDS.getValue(ScheduleFD.class);
if (scheduleTemp != null) {
if ((scheduleTemp.getDateOrder().equals(stringDateForCurrent) && !scheduleTemp.getStatus().equals(getString(R.string.task_completed))) || (!scheduleTemp.getDateOrder().equals(stringDateForCurrent) && scheduleTemp.getStatus().equals(getString(R.string.working_in_progress)))) {
scheduleList.add(scheduleTemp);
}
}
}
tra = new TaskFDAdapter(ScheduleCheckInOut.this, scheduleList);
trv.setAdapter(tra);

if (!scheduleList.isEmpty()) {
handler.postDelayed(runnable, 360);
}
}

@Override
public void onCancelled(@NonNull DatabaseError databaseError) {

}
};

@Override
protected void onDestroy() {
super.onDestroy();
dbrCurrentTask.orderByChild("dateOrder").startAt(stringDateForWorkingInProgress).endAt(stringDateForCurrent).removeEventListener(todayTasks);
}

我也做了同样的事情,但是用了 try catch:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

try {
dbrCurrentTask.orderByChild("dateOrder").startAt(stringDateForWorkingInProgress).endAt(stringDateForCurrent).addValueEventListener(todayTasks);
} catch (NumberFormatException e){
//refresh
finish();
overridePendingTransition(0, 0);
startActivity(new Intent(getApplicationContext(), THIS_ACTIVITY.class));
overridePendingTransition(0, 0);
}

但是 Logcat 中仍然显示 NumberFormatException,并且当数据库值更改时停止工作。
我还尝试将字符串键更改为不显示任何数字但显示相同的异常。

经过大量测试,我发现 Error: java.lang.NumberFormatException: For input string: "201908241000gjjj" 中显示的字符串键 201908241000gjjj 是子值更改的字符串键 201908261000ffghrr 的前一个字符串键:

{
"Schedules": {
"201908231000bb": {children}
"201908241000gjjj": {children} //NumberFormatException show this key
"201908261000ffghrr": {children} //value changed
}
}

对于子项中的任何更改,都会显示前一个字符串键的异常。如果子项在 201908241000gjjj 中发生更改,则异常显示 201908231000bb。如果子项在 201908231000bb 中发生更改,则不会出现错误,因为 201908231000bb 是第一个并且没有之前的字符串键。
为什么会发生这种奇怪的事情呢? child 的体型会影响这个吗?我有另一个引用组,有 3 个子项,每个子项都有字符串值,当数据库更改时没有问题,但此引用组(时间表)有大约 34 个子项,每个子项有字符串值。

我希望无论数据库中的值如何更改,该 Activity 都将继续工作,但在引用的数据库发生任何更改后,它会返回到上一个 Activity ,然后弹出“应用程序不工作”。

最佳答案

我发现有点不清楚你的问题是什么,但这是我的尝试:

您在监听器中的 .getValue(ScheduleFD.class) 中收到 NumberFormatException ,这是我根据您的帖子做出的猜测,您应该在你的日志猫。

你不一定需要将查询包装在try catch中,你可能会捕获一些东西,但它不会是NumberFormatException,如果你想使用try/catch,请包装它位于 EventListener 内的 .getValue(ScheduleFD.class) 周围,我认为更确定您收到了异常。

但是,如果您收到异常是因为您的逻辑错误,那么如果您期望捕获异常,那么获取值有什么意义呢?您在数据库中存储数据的方式必须与您检索数据的方式一致。

如果我错了,我建议将您的 ScheduleFD.class 添加到您的问题以及您想要获取的示例数据。

关于java - 当数据库更改时,前一个 String 键会发生 NumberFormatException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57780784/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com