Android E/SQLiteDatabase 上的 SQLite:错误插入日期=05/04/2021 时间=60000.0

SQLite on Android E/SQLiteDatabase: Error inserting date=05/04/2021 time=60000.0

我正在 android studio 上用 Sqlite 创建一个数据库。

这是我的代码:

 @Override
    public void onCreate(@NotNull SQLiteDatabase db) {
        //SQL - Structured Query Language
        String CREATE_DATA_TIME_TABLE = "CREATE TABLE " + UtilDB.TABLE_DATA_TIME + "("
                + UtilDB.KEY_DATE + " TEXT PRIMARY KEY,"
                + UtilDB.KEY_TIME + " INTEGER" + ")";
        db.execSQL(CREATE_DATA_TIME_TABLE); //creating our table

    }





 public void addWorkTime(@NotNull WorkTime workTime) {

//        if there is just a date, it will update this worktime
        if (thereIsADate(workTime.getDate()))
            updateWorkTime(workTime);

        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(UtilDB.KEY_DATE, workTime.getDate());
        values.put(UtilDB.KEY_TIME, workTime.getTime());

        Log.d(TAG, workTime.toString());

        //Insert to row
        db.insert(UtilDB.TABLE_DATA_TIME, null, values); // TODO

        Log.d(TAG, "addWorkTime: " + "item added");
        db.close(); //closing db connection!

    }

但是我有这个问题:

2021-05-04 21:23:02.697 16874-16874/com.application.care E/SQLiteDatabase: Error inserting date=05/04/2021 time=60000.0
    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.application.care.data.HandlerDB.addWorkTime(HandlerDB.java:78)
        at com.application.care.ui.home.HandlerCountDownTime.setView(HandlerCountDownTime.java:61)
        at com.application.care.ui.home.HomeFragment.manageCountDownTime(HomeFragment.java:27)
        at com.application.care.ui.home.HomeFragment.onCreateView(HomeFragment.java:48)
        at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698)
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187)
        at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2224)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1997)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1953)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2629)
        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2577)
        at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2722)
        at androidx.fragment.app.FragmentStateManager.activityCreated(FragmentStateManager.java:346)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1188)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
        at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1497)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2625)
        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2577)
        at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:247)
        at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:541)
        at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:201)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1248)
        at android.app.Activity.performStart(Activity.java:6679)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2609)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
        at android.app.ActivityThread.-wrap12(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        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) 2021-05-04 21:23:02.700 16874-16874/com.application.care D/HandlerCountDownTime: []

我该如何解决?

编辑:我尝试重新安装数据库,但存在这个问题:

2021-05-05 17:54:01.039 18089-18089/com.application.care E/SQLiteDatabase: Error inserting date=05/05/2021 time=2.6133548E7 android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: DataTime.date (code 1555) 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.application.care.data.HandlerDB.addWorkTime(HandlerDB.java:78) at com.application.care.ui.home.HandlerCountDownTime.onEnd(HandlerCountDownTime.java:94) at cn.iwgang.countdownview.CountdownView.onFinish(CountdownView.java:139) at cn.iwgang.countdownview.CustomCountDownTimer.handleMessage(CustomCountDownTimer.java:106) at android.os.Handler.dispatchMessage(Handler.java:102) 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)

我怀疑您的问题是您更改了 onCreate 方法:-

public void onCreate(@NotNull SQLiteDatabase db) {
    //SQL - Structured Query Language
    String CREATE_DATA_TIME_TABLE = "CREATE TABLE " + UtilDB.TABLE_DATA_TIME + "("
            + UtilDB.KEY_DATE + " INTEGER PRIMARY KEY," //<<<<<<<<<< WAS THIS
            + UtilDB.KEY_TIME + " INTEGER" + ")";
    db.execSQL(CREATE_DATA_TIME_TABLE); //creating our table

}

public void onCreate(@NotNull SQLiteDatabase db) {
    //SQL - Structured Query Language
    String CREATE_DATA_TIME_TABLE = "CREATE TABLE " + UtilDB.TABLE_DATA_TIME + "("
            + UtilDB.KEY_DATE + " TEXT PRIMARY KEY," //<<<<<<<<<< NOW THIS
            + UtilDB.KEY_TIME + " INTEGER" + ")";
    db.execSQL(CREATE_DATA_TIME_TABLE); //creating our table

}
  • 查看 //<<<<<<<<<<
  • 表示的评论

但是有 运行 第一个版本,进行了更改,然后 运行 第二个版本没有删除数据库。

DataType Mismatch 仅当尝试 insert/update 行且 rowid 列时才会发生或者 rowid 列的别名不是整数。

  • 编码column_name INTEGER PRIMARY KEY的特殊之处在于它使通常隐藏的rowid列的列和别名。

SQLite Result and Error Codes - Result Code meanings

(20) SQLITE_MISMATCH The SQLITE_MISMATCH error code indicates a datatype mismatch.

SQLite is normally very forgiving about mismatches between the type of a value and the declared type of the container in which that value is to be stored. For example, SQLite allows the application to store a large BLOB in a column with a declared type of BOOLEAN. But in a few cases, SQLite is strict about types. The SQLITE_MISMATCH error is returned in those few cases when the types do not match.

The rowid of a table must be an integer. Attempt to set the rowid to anything other than an integer (or a NULL which will be automatically converted into the next available integer rowid) results in an SQLITE_MISMATCH error.

修复

如果您可以承受丢失任何现有数据的简单修复方法是删除数据库,这可以通过卸载应用程序来实现。然后您可以重新运行 应用程序。

如果您有需要保存的现有数据(可能不太可能,因为数据列中的数据可能无用),那么您需要引入一次性 运行,它将:-

  1. 使用最终的列定义创建一个新的 table,确保 table 的名称不同,例如your_table_NEW.
  2. 从原来的 table
  3. 填充新的 table
  4. 使用 ALTER TABLE
  5. 重命名原来的 table
  6. 将新的 table 重命名为原来的 table 名称
  7. 删除新的 table。