"SQLiteDatabase.insert (table_name, нулевые, ContentValues);"показывает ошибку "несоответствие типов данных" - PullRequest
0 голосов
/ 14 апреля 2019

Я знаю основы 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"+")";

А вот и моя ошибка (то есть " [INSERT INTO notes (обратное, слово) VALUES (?,?)] Несоответствие типа данных" ): - (

    > 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 Ответ

0 голосов
/ 15 апреля 2019

Проблема

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

Как таковой столбец Обратный или столбец Слово был определен как псевдоним rowid столбец.

Псевдоним rowid определяется, когда вы специально кодируете column_name INTEGER PRIMARY KEY (с ключевым словом AUTOINCREMENT или без него) или эквивалентный в соответствии с ROWID и INTEGER PRIMARYКЛЮЧ .

Поэтому

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

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

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

Исправление

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

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

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

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

...