Таблица базы данных комнат Android не обновляется

Я пытаюсь обновить значение из моей таблицы, используя RX2 и комнату.

Мой предмет

@Entity(tableName = "myCustomTable")
public class MyItem  {

    @NonNull
    @PrimaryKey
    @ColumnInfo(name = "item_id")
    @SerializedName("item_id")
    private Long item_id;

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

    @ColumnInfo(name = "country")
    @SerializedName("country")
    private String value;

    @SerializedName("image")
    @ColumnInfo(name = "image")
    private String image;

    @ColumnInfo(name = "latitude")
    @SerializedName("latitude")
    private Double latitude;

    @ColumnInfo(name = "longitude")
    @SerializedName("longitude")
    private Double longitude;

    @ColumnInfo(name = "valid")
    private boolean valid;

    public MyItem (Long item_id, String name, String value, String image, Double latitude, Double longitude, boolean valid) {
        this.item_id = item_id;
        this.name = name;
        this.value = value;
        this.image = image;
        this.latitude = latitude;
        this.longitude = longitude;
        this.valid = true;
    }

    public boolean isValid() {
        return valid;
    }

    public Long getItem_id() {
        return item_id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public Double getLatitude() {
        return latitude;
    }

    public Double getLongitude() {
        return longitude;
    }
}

Мой запрос таков:

@Dao
public interface CustomDao {
  @Insert(onConflict = OnConflictStrategy.REPLACE)
  void insertItem(MyItem item);

  @Query("UPDATE myCustomTable SET valid = :isValid WHERE item_id= :id")
  void flagQueued(long id, boolean isValid);
}

По умолчанию действительный - истина;

Это будет вызвано и преобразовано в завершаемую реализацией базы данных.

public class LocalDataSource implements DataSource {
  private CustomDao customDao;

  @Inject
  public LocalPupilDataSource(CustomDao customDao) {
    this.customDao = customDao;
  }

  public Completable flagQueued(long id) {
    return Completable.fromAction(() -> customDao.flagQueued(id,false));
  }
}

И, в конце концов, я вызываю подписчиком метод flagQueued. Этот подписчик сообщает об успешном завершении.

mCompositeDisposable.add(viewModel.deleteItem(id)
  .subscribeOn(schedulerProvider.computation())
  .observeOn(schedulerProvider.ui())
  .subscribe(() -> Snackbar.make(getActivity().findViewById(R.id.main_layout),
    R.string.user_removed, Snackbar.LENGTH_SHORT).show(), error -> Timber.e(error,error.getMessage()) ) );

К сожалению, значение не обновляется. Конечно, ID есть в таблице.

Любые советы будут высоко ценится.

Результат - 1 @pskink

user3903940 08.09.2018 12:44

item_id длинный? Может быть, вы сравниваете long с другим типом данных в своем запросе? Разместите класс MyItem, пожалуйста

Nicola Gallazzi 08.09.2018 12:47

Привет, @NicolaGallazzi. Просто обновил вопрос с классом Myitem

user3903940 08.09.2018 12:54

Это выглядит хорошо. Вы можете заглянуть внутрь своей базы данных с помощью этого инструмента sqlitebrowser.org. Используйте проводник файлов устройства в Android Studio и посмотрите data / data / yourapppackageid, чтобы найти базу данных.

Nicola Gallazzi 08.09.2018 13:15

Я думаю, что в имени таблицы @Entity (tableName = "myCustomTable") есть пробел. Вы можете это проверить?

Amit Kumar 08.09.2018 13:23

Проверял это уже @AmitKumar. К сожалению, проблема не в этом.

user3903940 08.09.2018 13:27

Это действительно было успешным @pskink. Я не вижу видимой таблицы ни при предварительном просмотре, ни при выполнении команды select *. Это забавно, так как я на своем эмуляторе не в сети и беру данные из базы данных.

user3903940 08.09.2018 13:33

@pskink В базе данных не объявлена ​​схема. Странный.

user3903940 08.09.2018 14:02

@pskink Я копирую путь к базе данных из эмулятора, открываю браузер sqlite, открываю новую базу данных, выбираю файл mytestDatabase.db и открываю его.

user3903940 08.09.2018 14:08
4
9
2 263
1

Ответы 1

Нашел проблему. После нескольких часов отладки.

Значение по умолчанию, которое я присваиваю конструктору this.valid = true;, по какой-то причине нарушило ЗАПРОС.

Таким образом, решение состоит в том, чтобы просто удалить значение ошибки и присвоить желаемое значение элементу, когда я собираюсь вставить его в таблицу.

Есть ли на GitHub репозиторий для комнаты, где я мог бы опубликовать проблему?

Это решение не сработало для меня, вставка работает нормально, но обновление не работает idk Y Это такая ужасная ошибка .. даже не вызывает никаких ошибок

shadygoneinsane 29.03.2020 14:20

Другие вопросы по теме