java - 获取 UNIQUE 约束失败:android studio 中的 tbl_data.id(Sqlite 代码 1555 SQLITE_CONSTRAINT_PRIMARYKEY)错误
问题描述
当我将 id 初始化为主键并添加了唯一属性时,我收到了这个错误。
数据类代码:
@Entity(tableName = "tbl_data" , indices = {@Index(value = {"id"},
unique = true)})
public class Data {
@PrimaryKey
private Integer id ;
private Integer year;
private Double dowry;
public Data(Integer id,Integer year, Double dowry) {
this.id = id;
this.year = year;
this.dowry = dowry;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public Double getDowry() {
return dowry;
}
public void setDowry(Double dowry) {
this.dowry = dowry;
}
数据库类代码:
@Database(version = 1 , exportSchema = false , entities = {Data.class} )
public abstract class AppDatabase extends RoomDatabase {
private static AppDatabase appDatabase;
public static AppDatabase getAppDatabase(Context context) {
if (appDatabase == null)
appDatabase = Room.databaseBuilder(context.getApplicationContext(),
AppDatabase.class,
"db_app")
.allowMainThreadQueries().fallbackToDestructiveMigration()
.build();
return appDatabase;
}
public abstract DataDao getDataDao();
}
和主要活动代码:
db = AppDatabase.getAppDatabase(this);
dataDao = db.getDataDao();
dataDao.insertC(new Data(1,1315, 0.004 ), new Data(2,1316, 0.005), new Data(3,1317, 0.006), new Data(4,1318, 0.007));
和 logat 中的完整错误:
2021-11-07 12:20:45.070 24994-24994/com.mohajer.kitset2 E/AndroidRuntime:致命异常:主进程:com.mohajer.kitset2,PID:24994 java.lang.RuntimeException:无法启动活动 ComponentInfo{ com.mohajer.kitset2/com.mohajer.kitset2.MainActivity}:android.database.sqlite.SQLiteConstraintException:唯一约束失败:tbl_data.id(Sqlite 代码 1555 SQLITE_CONSTRAINT_PRIMARYKEY),(操作系统错误 - 2:没有这样的文件或目录)在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3430) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3614) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:86) 在 android.app .servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 在 android.app.servertransaction.TransactionExecutor。在 android.os.Handler.dispatchMessage(Handler.java:112) 在 android.os.ActivityThread$H.handleMessage(ActivityThread.java:2199) 处执行(TransactionExecutor.java:68) 在 android.os.Looper.loop(Looper .java:216) 在 android.app.ActivityThread.main(ActivityThread.java:7625) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit .java:524) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987) 引起:android.database.sqlite.SQLiteConstraintException:唯一约束失败:tbl_data.id(Sqlite 代码 1555 SQLITE_CONSTRAINT_PRIMARYKEY),(操作系统错误 - 2:没有这样的文件或目录)在 android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:841) 在 android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:803) 在 android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86) 在 androidx.sqlite.db.framework.FrameworkSQLiteStatement.executeInsert(FrameworkSQLiteStatement .java:51) 在 com.mohajer.kitset2.DataDao_Impl.insertC(DataDao_Impl.java:50) 在 com.mohajer.kitset2.MainActivity.onCreate(MainActivity. java:36) 在 android.app.Activity.performCreate(Activity.java:7458) 在 android.app.Activity.performCreate(Activity.java:7448) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1286) 在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3409) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3614) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:86) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor .java:68) 在 android.os.Handler.dispatchMessage(Handler.java:112) 在 android.os.ActivityThread$H.handleMessage(ActivityThread.java:2199) 在 android.os.Looper.loop(Looper.java: 216) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java) 的 java.lang.reflect.Method.invoke(Native Method) 的 android.app.ActivityThread.main(ActivityThread.java:7625)第524章)servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2199) at android.os .Handler.dispatchMessage(Handler.java:112) 在 android.os.Looper.loop(Looper.java:216) 在 android.app.ActivityThread.main(ActivityThread.java:7625) 在 java.lang.reflect.Method。在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987) 的 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524) 调用(本机方法)servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2199) at android.os .Handler.dispatchMessage(Handler.java:112) 在 android.os.Looper.loop(Looper.java:216) 在 android.app.ActivityThread.main(ActivityThread.java:7625) 在 java.lang.reflect.Method。在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987) 的 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524) 调用(本机方法)os.Handler.dispatchMessage(Handler.java:112) 在 android.os.Looper.loop(Looper.java:216) 在 android.app.ActivityThread.main(ActivityThread.java:7625) 在 java.lang.reflect.Method .invoke(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)os.Handler.dispatchMessage(Handler.java:112) 在 android.os.Looper.loop(Looper.java:216) 在 android.app.ActivityThread.main(ActivityThread.java:7625) 在 java.lang.reflect.Method .invoke(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
解决方案
使用 @PrimaryKey 意味着一个 UNIQUE 约束,因此不需要 id 列上的唯一索引(索引只是浪费)。
插入时使用 id 值对插入进行硬编码(没有忽略冲突的 onConflict 约束)将在从全新安装(重新运行)运行一次后导致 UNIQUE 冲突,因为 id 的 1、2、3 和 4 已经存在.
将@Dao 编码为@Insert(onConflict = OnConflictStrategy.IGNORE)
将忽略冲突而不会失败并且不会插入重复项。
推荐阅读
- javascript - React Native:Svg 不占用屏幕高度的一半
- node.js - nodejs express嵌套sequelize异步等待
- python - 使用 pytest 和 xdist 访问 CLI 参数
- mysql-5.7 - Mysql 慢速多连接查询 - 5.7 版
- .net-core - ASP.NET Core MVC 标签标签助手
- java - Jackson ObjectMapper 反序列化 CustomException 类
- r - R:从不同的起始值中减去列中的值
- c - 如何在 GDB 中以符号形式检查枚举变量的值?
- sql - 如何通过最近编辑合并当前表和历史表顺序
- wordpress - ACF CPT UI 帖子列表