【问题标题】:TimePickerDialog in Android and add to databaseAndroid中的TimePickerDialog并添加到数据库
【发布时间】:2020-03-25 09:24:57
【问题描述】:

我试图将时间和日期从 androids TimePickerDialog 和 DatePickerDialog 添加到我的 SQLite 数据库中。但是,当我尝试这个时,它不起作用。没有数据出现在数据库中。我认为在将数据添加到数据库时,对话框会同时显示。

这是我的 addItem() 函数,由按钮触发。

private void addItem(){

    final Calendar calendar = Calendar.getInstance();
    int HOUR = calendar.get(Calendar.HOUR);
    int MINUTE = calendar.get(Calendar.MINUTE);
    int YEAR = calendar.get(Calendar.YEAR);
    int MONTH = calendar.get(Calendar.MONTH);
    int DATE = calendar.get(Calendar.DATE);

    //CREATES THE DATEPICKER DIALOG
    DatePickerDialog datePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
        @Override
        public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {

            dateString = year + " " + month + " " + dayOfMonth;

        }
    }, YEAR, MONTH, DATE);

    //CREATES THE TIMEPICKER DIALOG
    TimePickerDialog timePickerDialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
        @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

            timeString = hourOfDay + ":" + minute;

        }
    }, HOUR, MINUTE, true);

    datePickerDialog.show();
    timePickerDialog.show();

    ContentValues cv = new ContentValues();
    cv.put(GroceryContract.GroceryEntry.COLUMN_DATE, dateString);
    cv.put(GroceryContract.GroceryEntry.COLUMN_TIME, timeString);
    mDatabase.insert(GroceryContract.GroceryEntry.TABLE_NAME, null, cv);
    mAdapter.swapCursor(getAllItems());

}

当我在 onDateSet 或 onTimeSet 方法中移动 ContentValues cv... 代码时,它可以正常工作。但是,这似乎是一种不好的做法。

有什么想法吗?

【问题讨论】:

    标签: android datepickerdialog timepickerdialog


    【解决方案1】:

    当您在对话框上调用 show 时,该对话框仅显示,并且在用户选择它之前无法知道所选值是什么。这就是为什么他们有回调,它的代码将异步运行,回调将在有值时执行。因此,您的插入位置错误,因为尚未设置该值。

    我会用插入创建一个方法:

    private void saveGroceryDate() {
        ContentValues cv = new ContentValues();
        cv.put(GroceryContract.GroceryEntry.COLUMN_DATE, dateString);
        cv.put(GroceryContract.GroceryEntry.COLUMN_TIME, timeString);
        mDatabase.insert(GroceryContract.GroceryEntry.TABLE_NAME, null, cv);
        mAdapter.swapCursor(getAllItems());
    
    }
    

    另一个使用时间选择器:

    private void selectGroceryTime() {
        //CREATES THE TIMEPICKER DIALOG
        TimePickerDialog timePickerDialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
            @Override
            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
    
                timeString = hourOfDay + ":" + minute;
                saveGroceryDate();
            }
        }, HOUR, MINUTE, true);
    }
    

    这样在选择日期之后(执行 DatePicker 回调)我会调用 selectGroceryTime() 方法来选择时间:

        //CREATES THE DATEPICKER DIALOG
        DatePickerDialog datePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
    
                dateString = year + " " + month + " " + dayOfMonth;
                selectGroceryTime();
            }
        }, YEAR, MONTH, DATE);
    

    在选择时间后(在 TimePicker 回调中),我将通过调用 saveGroceryDate() 将所有数据保存在数据库中,因为那时所有数据都将保存在实例变量中。

    请记住,用户可以取消这两个对话框,因此请检查您的代码在这种情况下的行为方式是否符合您的要求。如果该数据是强制性的,这可能很重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多