如何使用datepicker在android中的SqLite数据库中插入日期

如何使用datepicker在android中的SqLite数据库中插入日期,android,sqlite,android-datepicker,android-database,Android,Sqlite,Android Datepicker,Android Database,我是android新手。我创建了一个日期选择器。但我无法在数据库中插入日期。 我试着: SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); String formattedDate = formatter.format(provider.getDate()); values.put(DATE, formattedDate ); android不支持日期数据类型。所以我声明为String。 但问题并没有得到解决。 这是

我是android新手。我创建了一个日期选择器。但我无法在数据库中插入日期。 我试着:

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate = formatter.format(provider.getDate());
values.put(DATE, formattedDate );
android不支持日期数据类型。所以我声明为String。 但问题并没有得到解决。 这是我的密码:

数据库处理程序

public class DatabaseHandler extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "income.db";
public static final String TABLE_NAME = "income_table";
public static final String ID="id";
public static final String AMOUNT = "amount";
public static final String PAYER_NAME = "payer";
public static final String NOTE = "note";

public static final String DATE= "date";


String query = "CREATE TABLE " + TABLE_NAME +
        "(" +ID+ " integer primary key autoincrement, " + AMOUNT + " real, "
        + PAYER_NAME + " text, " + NOTE + " text, " + DATE + " text " + ")";




public DatabaseHandler(Context context) {
    super(context, DATABASE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
    sqLiteDatabase.execSQL(query);

}

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
    sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    onCreate(sqLiteDatabase);

}

public void addInformation(DataProvider provider){
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
    String formattedDate = formatter.format(provider.getDate());
    SQLiteDatabase db = getWritableDatabase();
    ContentValues values=new ContentValues();
    values.put(AMOUNT,provider.getMoney());
    values.put(PAYER_NAME,provider.getName());
    values.put(NOTE,provider.getDesc());
    values.put(DATE, formattedDate );
    db.insert(TABLE_NAME, null, values);
    db.close();

}
数据提供程序类:

public class DataProvider {
private double money;
private String name;
private String desc;
private String date;

public String getDate() {
    return date;
}

public void setDate(String date) {
    this.date = date;
}

public DataProvider(double money, String name, String desc, String date) {
    this.money = money;
    this.name = name;
    this.desc = desc;
    this.date=date;


}



public double getMoney() {
    return money;
}

public void setMoney(double money) {
    this.money = money;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getDesc() {
    return desc;
}

public void setDesc(String desc) {
    this.desc = desc;
}

}
日期选择器类:

public class Income extends AppCompatActivity implements View.OnClickListener {

TextView amount, payer, note, show,showDate;
EditText edit_amount, payer_name, edit_note;
Button save, cancel;
DatabaseHandler db;
ImageButton date;
int year,month,day;

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

    save = (Button) findViewById(R.id.save);
    cancel = (Button) findViewById(R.id.cancel);

    amount = (TextView) findViewById(R.id.amount);
    payer = (TextView) findViewById(R.id.payer);
    note = (TextView) findViewById(R.id.note);
    show = (TextView) findViewById(R.id.show);
    showDate = (TextView) findViewById(R.id.showDate);

    edit_amount = (EditText) findViewById(R.id.edit_amount);
    payer_name = (EditText) findViewById(R.id.edit_payer);
    edit_note = (EditText) findViewById(R.id.edit_note);
    //date= (ImageButton) findViewById(R.id.datePicker);

    db = new DatabaseHandler(this);

    save.setOnClickListener(this);
    cancel.setOnClickListener(this);
    showDate.setOnClickListener(this);
}

@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void onClick(View view) {
    if (view.getId() == R.id.save) {
        String amounts,payers,notes,date;
        amounts=edit_amount.getText().toString();
        payers= payer_name.getText().toString();
        notes= edit_note.getText().toString();
        date=showDate.getText().toString();
        if(amounts.isEmpty())
        {
           edit_amount.setError("Amounts should not be blank");
        }
        else {
            Double a =new Double(amounts.toString());
            DataProvider provider = new DataProvider(a, payers, notes,date);
            db.addInformation(provider);
            Intent i = new Intent(this, MainActivity.class);
            startActivity(i);
        }
    }

    if (view.getId() == R.id.cancel) {
        Intent i =new Intent(this,MainActivity.class);
        startActivity(i);
    }

    if (view.getId()==R.id.showDate){

            final Calendar c = Calendar.getInstance();
            year = c.get(Calendar.YEAR);
            month = c.get(Calendar.MONTH);
            day = c.get(Calendar.DAY_OF_MONTH);

            DatePickerDialog dpd = new DatePickerDialog(this,
                    new DatePickerDialog.OnDateSetListener() {
                        @Override
                        public void onDateSet(DatePicker datePicker, int i, int i1, int i2) {
                        showDate.setText(i+"/"+(i1+1)+"/"+i2);
                        }
                    },year,month,day);
            dpd.show();


    }

    }
}

当插入数据库时,您没有存储日期选择器拾取的日期,请尝试替换以下代码

values.putDATE,formattedDate

带代码

values.putDATE、showDate.getText.toString


请确保在单击“保存”按钮之前,您已选择日期及其在showText文本框中的显示。

使用日期选择器时,我们将所有选定日期格式化为8个字符长,然后查看日期子程序将该字符串格式化为如下所示 01-02-2017但此格式仅适用于将字符串发送到DB时的视图,它被转换回01022017以下是我们的日期选择器代码,格式化视图的子程序也包括删除破折号的代码-

日期选择器代码

    public void findByDate(){

    final Dialog dialog = new Dialog(DetailsActivity.this,R.style.DatePickerTheme);
    dialog.setContentView(R.layout.datepickerview);
    dialog.setTitle("");
    DatePicker picker = dialog.findViewById(R.id.datePicker);
    final Calendar c = Calendar.getInstance();
    mYear = c.get(Calendar.YEAR);
    mMonth = c.get(Calendar.MONTH);
    mDay = c.get(Calendar.DAY_OF_MONTH);
    picker.updateDate(mYear, mMonth, mDay);// Keeps Calendar initial view what ever today is!

    picker.init(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH), new DatePicker.OnDateChangedListener() {

        @Override
        public void onDateChanged(DatePicker picker, int year, int monthOfYear, int dayOfMonth) {

                String searchFrom = (String.valueOf(monthOfYear + 1)) + (String.valueOf(dayOfMonth)) + String.valueOf(year);
                if (searchFrom.length() == 7) {
                    StringBuilder str = new StringBuilder(searchFrom);
                    str.insert(2, '0');
                    etPurchaseDate.setText(str);
                } else if (searchFrom.length() == 6) {
                    StringBuilder str = new StringBuilder(searchFrom);
                    str.insert(0, '0');
                    str.insert(2, '0');
                    System.out.println("===========================str "+str);
                    etPurchaseDate.setText(str);
                } else {

                    etPurchaseDate.setText(searchFrom);
                }
                Toast.makeText(DetailsActivity.this, "Date Formatted for Storage", Toast.LENGTH_LONG).show();
                etCost.requestFocus();
                dialog.dismiss();

        }
});

    dialog.show();
}
设置日期字符串格式的子例程

    public String DATE_TO_FORMAT(String formatDATE){
    /* THIS METHOD KEEP THE DATE FORMATTED FOR DISPLAY */
    /* ONLY CALLED FROM ERROR TRAPPING */
    String s = etPurchaseDate.getText().toString();
    String RDmonth = s.substring(0, 2);
    String RDday = s.substring(2, 4);
    String RDyear = s.substring(4, 8);
    formatDATE = RDmonth + "-" + RDday + "-" + RDyear;
    return formatDATE;
}
拆下仪表板的

                if(etPurchaseDate.length()==10){//
                /* Routine puts DATE back in DB as 8 Character String REMOVES dashes "-" */
                StringBuilder removeTHIS = new StringBuilder(etPurchaseDate.getText().toString());
                String value = removeTHIS.toString().replace("-", "");
                etPurchaseDate.setText(value);
                etCost.requestFocus();
                purchase_date = value;
            //}else{
                //etPurchaseDate.setText(etPurchaseDate.getText().toString());
                etCost.requestFocus();
            }

此设计的一个大问题是处理最终用户不使用日期选择器这需要在保存之前在错误捕获中处理,例如,像这样输入的日期00-33-0217最好强制使用日期选择器输入所有日期,并将字段设置为禁用,但该设计有其他限制问题

db.insertTABLE_NAME,null,value;替换下面的代码db.insertTABLE_NAME,null,value;下面,它将告诉您确切的错误消息ddb.insertOrThrowTABLE_NAME,null,value;表名称,空,值;