Почему свойство onConflict аннотации @Insert используется только в одном методе? - PullRequest
0 голосов
/ 21 июня 2020

Я просматривал документацию Google о доступе к данным с помощью Room DAO . Вот пример аннотации @Insert:

@Dao
public interface MyDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    public void insertUsers(User... users);

    @Insert
    public void insertBothUsers(User user1, User user2);

    @Insert
    public void insertUsersAndFriends(User user, List<User> friends);
}

Почему свойство onConflict аннотации @Insert используется только в первом методе? Не возникнут ли конфликты из-за других методов?

Или они просто используют значение по умолчанию (OnConflictStrategy.ABORT) свойства onConflict?

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Итак, существует три типа: OnConflictStrategry доступно + 2, которое уже устарело.

По умолчанию ABORT

  • ABORT (По умолчанию - отменить транзакцию и ничего не меняет, откат к предыдущим данным для записей, которые были обновлены)
  • FAIL (устарело)
  • IGNORE (игнорирует тот, у которого есть конфликт, и продолжает транзакцию)
  • REPLACE (удалить предыдущую транзакцию и добавить новую запись)
  • ROLLBACK (устарело)

SQLite документация

И в Room чего-то не хватает, что может вас беспокоить, и это не метод upsert . upsert означает вставку ИЛИ обновление. REPLACE не имеет того же эффекта, что и upsert, поскольку он удаляет запись и добавляет новую (удалить И вставить). Если вы ищете подтверждение, эта статья покажет вам, как это сделать.

1 голос
/ 21 июня 2020

Потому что вам может потребоваться разное поведение в конфликте для каждой вставки. Если бы вы могли определить только одно поведение (для таблицы? Или для базы данных?), Это было бы гораздо менее гибким и универсальным.

...