#java #android #android-sqlite
Вопрос:
У меня проблема с вставкой даты данных в базу данных. Я пытаюсь сделать автоматическое увеличение идентификатора, а дата используется с помощью datepicker. Это другой способ сохранить дату в базе данных или это другие ошибки в моем коде?
Ниже приводится dbhelper.java
public class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context) {
super(context, "Budget.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase DB) {
DB.execSQL("create Table Budget(id INTEGER primary key autoincrement not null, date TEXT)");
}
@Override
public void onUpgrade(SQLiteDatabase DB, int i, int i1) {
DB.execSQL("drop Table if exists Budget");
}
private String getDateTime() {
SimpleDateFormat dateFormat = new SimpleDateFormat(
"yyyy-MM-dd ", Locale.getDefault());
Date date = new Date();
return dateFormat.format(date);
}
public Boolean insertbudget(String id, String date)
{
SQLiteDatabase DB = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("id", id);
contentValues.put("date", date);
long result=DB.insert("Budget",null, contentValues);
if(result==-1){
return false;
}else{
return true;
}
}
public Cursor getdata() {
SQLiteDatabase DB = this.getWritableDatabase();
Cursor cursor = DB.rawQuery("Select * from Budget", null);
return cursor;
}
Ниже приведен код, который я объявляю датой, а база данных является основной
btnAdd = findViewById(R.id.btnAdd);
id = findViewById(R.id.id);
DB = new DBHelper(this);
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String idTXT = id.getText().toString();
String dateTXT = mDisplayDate.getText().toString();
Boolean checkAdddata = DB.insertbudget(idTXT, dateTXT);
if(checkAdddata==true)
Toast.makeText(Add.this, "New Entry Inserted", Toast.LENGTH_SHORT);
else
Toast.makeText(Add.this, "New Entry Not Inserted", Toast.LENGTH_SHORT);
}
});
//date
mDisplayDate = (TextView) findViewById(R.id.date);
mDisplayDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dialog = new DatePickerDialog(
Add.this,
android.R.style.Theme_Holo_Light_Dialog_MinWidth,
mDateSetListener,
year, month, day);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.show();
}
});
mDateSetListener = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, int year, int month, int day) {
month = month 1;
Log.d(TAG, "onDateSet: dd/mm/yyyy:" day "/" month "/" year);
String date = day "/" month "/" year;
mDisplayDate.setText(date);
}
};
Это ошибка, которая показывает
ошибку
Комментарии:
1. Если вы хотите, чтобы идентификатор автоматически увеличивался , зачем вы вставляете значение в столбец идентификатора?
Ответ №1:
Несоответствие типов данных довольно специфично, вы пытаетесь вставить значение, которое не является целочисленным значением, в столбец rowid или псевдоним столбца rowid
INTEGER PRIMARY KEY
(с АВТОИНКРЕМЕНТОМ или без него) приводит к созданию псевдонима столбца rowid.
В соответствии с public Boolean insertbudget(String id, String date)
этим вы передаете нецелочисленную строку.
Вы можете устранить это, используя public Boolean insertbudget(long id, String date)
, а затем скорректировав код в соответствии с требованиями (т. Е. Преобразовав строку в длинную). Ошибка синтаксического анализа, которую вы затем получите, должна указывать на реальную причину.
Однако самым простым решением было бы удалить строку contentValues.put("id", id);
, которой SQLite затем присвоит соответствующее значение. Затем вы можете настроить подпись метода, так как идентификатор передавать не нужно. Поэтому вы, возможно, захотите использовать :-
public Boolean insertbudget(String date)
{
SQLiteDatabase DB = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("date", date);
return result=(DB.insert("Budget",null, contentValues) > 0);
}