android - 冲突的房间数据库不工作,数据总是被插入
问题描述
我正在尝试从 API 获取一些数据并将其保存到房间数据库,但是我有一个列并且我正在更改它的值“isFavourite”。
我在一些关于使用 upsert 函数的答案中看到,我尝试使用它但仍然每次都覆盖数据。
@Dao
public abstract class ChannelDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
abstract long addChannelData(Channel channel);
@Query("UPDATE channel_table SET name= :name, url= :url , icon= :icon , streamer= :streamer , package_id= :package_id WHERE number= :number")
abstract void updateChannelData(String number, String name, String url, String icon, String streamer, String package_id);
@Transaction
void insOrUpdate(Channel channel) {
long id = addChannelData(channel);
if (id == -1) {
updateChannelData(channel.getNumber(), channel.getName(), channel.getUrl(), channel.getIcon(), channel.getStreamer(), channel.getPackage_id());
}
}
@Entity(tableName = "channel_table", foreignKeys = @ForeignKey(entity = ChannelsPackage.class, parentColumns = "id", childColumns = "package_id", onDelete = CASCADE))
public class Channel {
@NonNull
@PrimaryKey
@SerializedName("number")
@Expose
private String number;
@SerializedName("name")
@Expose
private String name;
@SerializedName("url")
@Expose
private String url;
@SerializedName("icon")
@Expose
private String icon;
@SerializedName("streamer")
@Expose
private String streamer;
private boolean favorite;
private boolean locked;
private String package_id;
public Channel(@NonNull String number, String name, String url, String icon, String streamer, boolean favorite, boolean locked, String package_id) {
this.number = number;
this.name = name;
this.url = url;
this.icon = icon;
this.streamer = streamer;
this.favorite = favorite;
this.locked = locked;
this.package_id = package_id;
}
@NonNull
public String getNumber() {
return number;
}
public void setNumber(@NonNull String number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getIcon() {
return icon;
}
public void setIcon(String icon) {
this.icon = icon;
}
public String getStreamer() {
return streamer;
}
public void setStreamer(String streamer) {
this.streamer = streamer;
}
public boolean isFavorite() {
return favorite;
}
public void setFavorite(boolean favorite) {
this.favorite = favorite;
}
public boolean isLocked() {
return locked;
}
public void setLocked(boolean locked) {
this.locked = locked;
}
public String getPackage_id() {
return package_id;
}
public void setPackage_id(String package_id) {
this.package_id = package_id;
}
}
解决方案
经过4天的搜索和搜索,发现问题,我有2个表channel_table和package_table
并且它们之间的关系太多了,我每次都在频道之前添加软件包并且是“onDelete = CASCADE”所以这就是为什么每次我尝试更新时都会删除所有频道的原因。
对于信息来制作 upsert 方法,它将是这样的:
@Insert(onConflict = OnConflictStrategy.REPLACE)
abstract void addChannelData(Channel channel);
@Query("UPDATE channel_table SET name= :name, url= :url , icon= :icon , streamer= :streamer , package_id= :package_id WHERE number= :number")
abstract void updateChannelData(String number, String name, String url, String icon, String streamer, String package_id);
@Transaction
@Query("SELECT COUNT(*) from channel_table WHERE number = :number")
abstract int isChannelExist(String number);
@Transaction
void insOrUpdate(List<Channel> channels) {
for (Channel channel : channels) {
if (isChannelExist(channel.getNumber()) > 0) {
updateChannelData(channel.getNumber(), channel.getName(), channel.getUrl(), channel.getIcon(), channel.getStreamer(), channel.getPackage_id());
} else {
addChannelData(channel);
}
}
}
推荐阅读
- c - 在 C 中,& 运算符在这样使用时会做什么:(x & y)?
- laravel - 如何使用 laravel 创建有限的搜索结果,如果限制 exsausted 用户将不再能够搜索
- vuejs2 - 在没有激活器的情况下使用 Vue、Vuex 和 Vuetify 为每个卡片项创建对话框的最佳实践是什么
- javascript - 请解释为什么此代码返回未定义
- android - NullPointerException 错误。应用程序运行但一直停止。请提供任何帮助
- python - 如何在tensorflow中使用给定的分隔符生成词汇?
- sql - 同一选择查询中的 Hive 查询条件语句
- python - 整数输入数的倒数
- excel - 在给定行中仅计算一次值的公式
- python - ModuleNotFoundError:没有名为“plotTools”的模块