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.
修复
如果您可以承受丢失任何现有数据的简单修复方法是删除数据库,这可以通过卸载应用程序来实现。然后您可以重新运行 应用程序。
如果您有需要保存的现有数据(可能不太可能,因为数据列中的数据可能无用),那么您需要引入一次性 运行,它将:-
- 使用最终的列定义创建一个新的 table,确保 table 的名称不同,例如your_table_NEW.
- 从原来的 table
填充新的 table
- 使用 ALTER TABLE
重命名原来的 table
- 将新的 table 重命名为原来的 table 名称
- 删除新的 table。
我正在 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.
修复
如果您可以承受丢失任何现有数据的简单修复方法是删除数据库,这可以通过卸载应用程序来实现。然后您可以重新运行 应用程序。
如果您有需要保存的现有数据(可能不太可能,因为数据列中的数据可能无用),那么您需要引入一次性 运行,它将:-
- 使用最终的列定义创建一个新的 table,确保 table 的名称不同,例如your_table_NEW.
- 从原来的 table 填充新的 table
- 使用 ALTER TABLE 重命名原来的 table
- 将新的 table 重命名为原来的 table 名称
- 删除新的 table。