热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

两次插入项目时,AndroidRoom持久性SQLiteConstraintException

如何解决《两次插入项目时,AndroidRoom持久性SQLiteConstraintException》经验,为你挑选了1个好方法。

我一直在使用Room Persistence库,在我将其放入两个不同的插入项之前,它一直都很好用。

声音实体类

@Entity
public class Sound {
@PrimaryKey(autoGenerate = true)
private int sid;
@ColumnInfo(name = "sound_theme")
private int soundTheme;
@ColumnInfo(name = "sound_name")
private String soundName;
@ColumnInfo(name = "sound_resource")
private int soundResource;
@ColumnInfo(name = "sound_image_resource")
private int soundImageResource;
@ColumnInfo(name = "sound_favorite")
private boolean isFavorite;
@ColumnInfo
private int usedCount;
@ColumnInfo
private long lastUsed;


 public Sound(int soundTheme, String soundName, int soundResource, int soundImageResource, boolean isFavorite, int usedCount, long lastUsed) {
    this.soundTheme = soundTheme;
    this.soundName = soundName;
    this.soundResource = soundResource;
    this.soundImageResource = soundImageResource;
    this.isFavorite = isFavorite;
    this.usedCount = usedCount;
    this.lastUsed = lastUsed;
}

请注意,我有一个声音ID作为自动生成的主键。

声道

@Dao
public interface SoundDao {

@Query("SELECT * FROM sound")
List getAll();

@Query("SELECT * FROM sound WHERE sid IN (:soundIds)")
List loadAllByIds(int[] soundIds);

@Query("SELECT * FROM sound WHERE sound_name LIKE :name LIMIT 1")
Sound findByName(String name);

@Query("SELECT * FROM sound WHERE sid LIKE :id LIMIT 1")
Sound findById(int id);

@Insert
void insertAll(Sound... sounds);

@Insert
void insertAllArrList(ArrayList sounds);

@Delete
void delete(Sound sound);

@Query("DELETE FROM sound")
public void deleteAllSounds();
}

错误与以下行一起出现:

      if (focusedSound.isFavorite()) 
      favorites.soundDao().insertAll(focusedSound); 
      else favorites.soundDao().delete(selectedSound);

第一次插入效果很好(如果您在其中插入多个项目也可以),第二次插入会崩溃。我认为这与声音id(sid)的主键有关,但我不确定如何解决。

以下是一些错误日志:

06-03 20:03:36.454 8807-8807/com.zaid.green.soundpress E/InputEventReceiver: 
Exception dispatching input event.
06-03 20:03:36.454 8807-8807/com.zaid.green.soundpress E/MessageQueue-JNI: 
Exception in MessageQueue callback: handleReceiveCallback
06-03 20:03:36.460 8807-8807/com.zaid.green.soundpress E/MessageQueue-JNI: 
android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: 
Sound.sid (code 1555)
SQLiteConnection at nativeExecuteForLastInsertedRowId(Native Method)  
SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782)
    at 

Pavneet_Sing.. 5

是的,您是对的,问题出在主要约束和重复项被插入。

解决方案:OnConflictStratergy在您的@intert方法上定义为

@Insert(OnConflict= OnConflictStrategy.REPLACE)
void insertAll(Sound... sounds);

@Insert(OnConflict= OnConflictStrategy.REPLACE)
void insertAllArrList(ArrayList sounds);

如您所见,这会将新对象替换为旧对象



1> Pavneet_Sing..:

是的,您是对的,问题出在主要约束和重复项被插入。

解决方案:OnConflictStratergy在您的@intert方法上定义为

@Insert(OnConflict= OnConflictStrategy.REPLACE)
void insertAll(Sound... sounds);

@Insert(OnConflict= OnConflictStrategy.REPLACE)
void insertAllArrList(ArrayList sounds);

如您所见,这会将新对象替换为旧对象


推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • 本文主要复习了数据库的一些知识点,包括环境变量设置、表之间的引用关系等。同时介绍了一些常用的数据库命令及其使用方法,如创建数据库、查看已存在的数据库、切换数据库、创建表等操作。通过本文的学习,可以加深对数据库的理解和应用能力。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • javascript二叉树基本功能实现
    都是常用的功能。删除是最复杂的。。test ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了10分钟了解Android的事件分发相关的知识,希望对你有一定的参考价值。什么是事件分发?大家 ... [详细]
  • React提供三种方式创建Refs:字符串Refs(将被废弃)回调函数RefsReact.createRef(从React16.3开始)第一种方式不推荐使用,原因在此,并且可能会在之后的版本移除。classMyComponentextendsReact.Component{constructor(props){sup ... [详细]
  • Arduino + ESP32C3 + TFT(1.8‘ ST7735S)基础平台(实验四)直接显示网络图片
    ------------------------------------------------------------------------------------------ ... [详细]
  • 目前正在做毕业设计,一个关于校园服务的app,我会抽取已完成的相关代码写到文章里。一是为了造福这个曾经帮助过我的社区,二是写文章的同时更能巩固相关知识的记忆。一、前言在爬取教务系统 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了利用AndroidCamera2的照相机api实现实时的图像采集与预览相关的知识,希望对你有一定的参考价值。&n ... [详细]
  • 嵌入式C语言笔记基础
    C语言变量结构体1.结构体进行变量赋值时,数据输入需要使用取地址运算符结构体指针变量,结构体数组#includestructst ... [详细]
author-avatar
搁浅几世琉璃
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有