【问题标题】:"SQLiteDatabase.insert(TABLE_NAME,null,ContentValues);" showing "datatype mismatch" error“SQLiteDatabase.insert(TABLE_NAME,null,ContentValues);”显示“数据类型不匹配”错误
【发布时间】:2019-04-14 15:11:51
【问题描述】:

我知道有关 SQLite 的基础知识。当我为 Android 开发进行 SQLite 逆向工程时--> 即使我已经复制了大部分代码并将其粘贴到我的,我的应用程序在 logcat 中显示有关数据不匹配的错误。

(错误在setNotes方法down)

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(Reverse,Word) 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)

提前致谢。

【问题讨论】:

  • 先尝试卸载应用重新运行。
  • 什么是行MainActivity.java:30
  • db.setNotes(enteredName,reversedName); MainActivity 第 30 行

标签: java android sqlite android-sqlite


【解决方案1】:

问题

数据类型不匹配只有一个原因,即尝试将非整数值插入 rowid 列或 rowid 的别名柱子。任何其他列都可以存储任何类型的值。

因此,列 Reverse 或列 Word 已被定义为 rowid 列的别名。

rowid 的别名是在您专门编码 column_name INTEGER PRIMARY KEY(带或不带 AUTOINCREMENT 关键字)或等效的 as per - ROWIDs and the INTEGER PRIMARY KEY 时定义的。

因此

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))增加版本号(SQLiteOpenHelper 超级调用的第 4 个参数),例如将super(c,"Notes_Database",null,1); 更改为super(c,"Notes_Database",null,2);

做完上述一项后,可以重新运行应用程序,这应该会引入更改的表。

【讨论】:

  • 感谢 mike,在更改 CREATE TABLE IF NOT EXISTS 并更改版本后,应用运行良好。
猜你喜欢
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多