База данных комнат в конфликте не работает, данные всегда были вставлены - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь получить некоторые данные из 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;
}
}

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

После поиска и поиска в течение 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);
            }
        }

    }
0 голосов
/ 21 ноября 2018

Изменить на onConflictStrategy.ABORT.Таким образом, транзакция будет прервана.

...