Постоянство комнаты Android SQLiteConstraintException при двойной вставке элементов - PullRequest
0 голосов
/ 03 июня 2018

Я работал с библиотекой постоянства Комната, которая работала отлично, пока я не выполнил элементы в двух разных вставках.

Класс звуковой сущности

@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;
}

Смотрите, что яиметь идентификатор звука в качестве первичного ключа, который генерирует автоматически.

Звук DAO

@Dao
public interface SoundDao {

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

@Query("SELECT * FROM sound WHERE sid IN (:soundIds)")
List<Sound> 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<Sound> 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);

первая вставка проходит хорошо (если вы вставите несколько элементов, она также будет работать), вторая вставка завершится сбоем.Я предполагаю, что это как-то связано с первичным ключом для идентификатора звука (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 

1 Ответ

0 голосов
/ 03 июня 2018

Да, вы правы, проблема связана с основным ограничением и вставкой дублирующих элементов.

Решение: определите OnConflictStratergy в ваших @intert методах как

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

@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertAllArrList(ArrayList<Sound> sounds);

Как видите, новые объекты будут заменены старыми

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...