【问题标题】:How to insert date in SqLite Database in android with datepicker如何使用 datepicker 在 android 的 Sqlite 数据库中插入日期
【发布时间】:2016-11-25 02:35:29
【问题描述】:

我是安卓新手。我创建了一个日期选择器。但我无法将日期插入数据库。 我试过:

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate = formatter.format(provider.getDate());
values.put(DATE, formattedDate );

Android 不支持 DATE 数据类型。所以我声明为字符串。 但问题并没有解决。 这是我的代码:

数据库处理程序

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();

}

DataProvider 类:

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();


    }

    }
}

【问题讨论】:

    标签: android sqlite android-datepicker android-database


    【解决方案1】:

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

    values.put(DATE, formattedDate );

    有代码

    values.put(DATE, showDate.getText().toString() );

    请确保在点击保存按钮之前,您已经选择了日期并且它出现在 showText 文本框中。

    【讨论】:

    • db.insert(TABLE_NAME, null, values);
    • 替换下面的代码 db.insert(TABLE_NAME, null, values);在下面,它会告诉你确切的错误信息,d
    • db.insertOrThrow(TABLE_NAME, null, values);(TABLE_NAME, null, values);
    【解决方案2】:

    当使用日期选择器时,我们将所有选择的日期格式化为 8 个字符长,然后查看日期,子例程将该字符串格式化为如下所示 2017 年 1 月 2 日,但这种格式仅适用于视图,仅当字符串发送到数据库时,它会转换回此 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使用日期选择器输入所有日期并将该字段设置为禁用但该设计存在其他问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2023-04-04
      • 2021-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多