android.база данных.sqlite.Исключение SQLiteDatatypeMismatchException: несоответствие типов данных (код 20 SQLITE_MISMATCH)

#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);
}