【问题标题】:Android Room onConflict = OnConflictStrategy.IGNORE not workingAndroid Room onConflict = OnConflictStrategy.IGNORE 不起作用
【发布时间】:2019-05-22 12:37:19
【问题描述】:

我在我的 android 应用程序中使用房间数据库。

向用户插入数据时,我已添加:

 // Not working onConflict = OnConflictStrategy.IGNORE/REPLACE
    @Insert(onConflict = OnConflictStrategy.IGNORE)
        void insertUser(User users);

但它不起作用。我也尝试过 onConflictStrategy.REPLACE 但它仍然无法正常工作。

用户类(有Getter和Setter):

@Entity
public class User {

    @PrimaryKey(autoGenerate = true)
    @NonNull
    @ColumnInfo(name = "id")
    private Integer id;

    @ColumnInfo(name = "user_name")
    @NonNull
    private String name;

    @ColumnInfo(name = "email")
    private String email;

    public User(@NonNull String name, String email) {
        this.name = name;
        this.email = email;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(name, user.name) &&
                Objects.equals(email, user.email);
    }

    @Override
    public int hashCode() {

        return Objects.hash(name, email);
    }
}

我也查看了其他问题并尝试了他们的解决方案,但仍然面临问题。

【问题讨论】:

  • “不工作”到底是什么意思?您的具体症状是什么?
  • @CommonsWare onConflictStrategy.REPLACE 和 onConflictStrategy.IGNORE 不起作用。它仍然插入重复记录
  • AFAIK,OnConflictStrategy 只是使用INSERT OR (例如INSERT OR REPLACE),所以it only affects UNIQUE, NOT NULL, CHECK, and PRIMARY KEY constraints。您插入的重复项是否与现有记录具有相同的主键?还是您希望冲突会考虑您的姓名和电子邮件字段?
  • @CommonsWare 这是第一次插入。我期待名称和电子邮件字段的冲突。我们能做到吗?
  • 您需要为这些列添加唯一索引。

标签: android android-room


【解决方案1】:

您需要添加唯一索引:

@Entity(indices = {@Index(value = {"user_name", "email"}, unique = true)})
public class User {
...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 2021-10-25
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多