«SQLiteDatabase.insert(ИМЯ_ТАБЛИЦЫ, null,ContentValues);» показывает ошибку «несоответствие типов данных»

#java #android #sqlite #android-sqlite

#java #Android #sqlite #android-sqlite

Вопрос:

Я знаю основы SQLite.Когда я работал над обратным проектированием SQLite для разработки Android -> Даже я скопировал большую часть кода и вставил его в свой, мое приложение показало ошибку в logcat о несоответствии данных.

(Ошибка в методе setNotes отключена)

 public class DatabaseHelper extends SQLiteOpenHelper {



public DatabaseHelper(Context c){
    super(c,"Notes_Database",null,1);
}
@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(Note.CREATE_TABLE);

}



@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {


    db.execSQL("DROP TABLE IF EXISTS "   Note.TABLE_NAME);
    onCreate(db);




}
public long setNotes(String wordv,String reversev){
    SQLiteDatabase db=this.getWritableDatabase();
    ContentValues values=new ContentValues();
    values.put("Word",wordv);
    values.put("Reverse",reversev);

    //This below line where the Error occurs.
    long id=db.insert(Note.TABLE_NAME,null,values);//<--


    db.close();
    return id;
}
 

Мое имя таблицы :

 public static final String CREATE_TABLE =
        "CREATE TABLE "   TABLE_NAME   "("
                  "Word"   " TEXT,"
                  "Reverse"   " TEXT" ")";
 

И вот моя ошибка (то есть «[ВСТАВИТЬ В примечания (обратные, Word) ЗНАЧЕНИЯ (?,?)] несоответствие типа данных»):- (

     > 2019-04-14 20:52:05.404 9597-9597/com.example.sqlwithjava E/SQLiteLog: (20) statement aborts at 5: ***[INSERT INTO notes(Reverse,Word) VALUES (?,?)] datatype mismatch***



2019-04-14 20:52:05.406 9597-9597/com.example.sqlwithjava E/SQLiteDatabase: Error inserting Reverse=gfdhg Word=ghdfg
        android.database.sqlite.SQLiteDatatypeMismatchException: datatype mismatch (code 20)
            at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
            at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782)
            at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
            at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
            at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1474)
            at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1343)
            at com.example.sqlwithjava.DatabaseHelper.setNotes(DatabaseHelper.java:47)
            at com.example.sqlwithjava.MainActivity.ReverseText(MainActivity.java:30)
            at java.lang.reflect.Method.invoke(Native Method)
            at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
            at android.view.View.performClick(View.java:5610)
            at android.view.View$PerformClick.run(View.java:22265)
            at android.os.Handler.handleCallback(Handler.java:751)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:154)
            at android.app.ActivityThread.main(ActivityThread.java:6077)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
 

И заранее спасибо.

Комментарии:

1. Сначала попробуйте удалить приложение и повторно запустить.

2. что такое строка MainActivity.java:30

3. db.setNotes(введенное имя, обратное имя); Строка MainActivity 30

Ответ №1:

Проблема

Существует только одна причина несоответствия типов данных, и это когда предпринимается попытка вставить нецелочисленное значение в столбец rowid или псевдоним столбца rowid. Любой другой столбец может хранить значения любого типа .

Таким образом, обратный столбец или слово столбца были определены как псевдоним столбца rowid.

Псевдоним идентификатора строки определяется при написании специального кода column_name INTEGER PRIMARY KEY (с ключевым словом AUTOINCREMENT или без него) или эквивалента в виде идентификаторов строк и ПЕРВИЧНОГО КЛЮЧА INTEGER.

Поэтому

 public static final String CREATE_TABLE =
    "CREATE TABLE "   TABLE_NAME   "("
              "Word"   " TEXT,"
              "Reverse"   " TEXT" ")";
 

Не может быть тем, что использовалось для определения таблицы.

Распространенной причиной того, что таблица определяется не так, как ожидалось, является частое неправильное представление о том, что метод onCreate помощника базы данных запускается при каждом запуске приложения. onCreate будет автоматически запускаться только один раз при создании базы данных. Все последующие запуски будут проверять, что база данных существует, и метод onCreate не будет запускаться автоматически.

Исправление

Исправление, по крайней мере, при разработке приложения, для применения измененного определения таблицы заключается в том, чтобы либо удалить базу данных, либо принудительно запустить метод onCreate после удаления любых таблиц (в противном случае создание завершится неудачей, или если определение таблицы включает CREATE TABLE IF NOT EXISTS ........ в себя, что попытка создания таблицы будет пропущена).

Таким образом, вероятным решением является выполнение одного из следующих действий :-

  • Удалите данные приложения.
  • Удалите приложение.
  • или (в вашем случае, поскольку мнетод onUpgrade работает нормально (удаляет таблицу, а затем вызывает onCreate)) увеличьте номер версии (4-й параметр для супер-вызова SQLiteOpenHelper), например, измените super(c,"Notes_Database",null,1); на super(c,"Notes_Database",null,2);

После выполнения одного из вышеперечисленных действий приложение может быть повторно запущено, что должно ввести измененную таблицу.

Комментарии:

1. Спасибо, Майк, после изменения CREATE TABLE, ЕСЛИ НЕ СУЩЕСТВУЕТ, и изменения версии приложение работало нормально.