Запрос на обновление номера - PullRequest
0 голосов
/ 22 марта 2020

Я использую библиотеку постоянства Room для Android и пытаюсь выполнить запрос на обновление для логического поля.

@Update
suspend fun updateProduct(product: Product)

Сущность продукта:

@Entity(tableName = "products")
data class Product(
    @ColumnInfo(name = "name") val name: String = "",
    @ColumnInfo(name = "price") val price: Int = 0,
    @ColumnInfo(name = "count") val count: Int = 0,
    @ColumnInfo(name = "description") val description: String = "",
    @ColumnInfo(name = "isPurchased") val isPurchased : Boolean = false
) {
    @PrimaryKey var id: String = UUID.randomUUID().toString()
    @ColumnInfo(name = "date") var date: Long = Date().time
}

Подобные запросы как удаление, вставка работают нормально. Подчиненный запрос должен найти идентификатор продукта и обновить все поля, но он не работает. Пожалуйста, не пишите о запросе вставки вместо обновления, это подвох.

Обновление: Метод обновления возвращает 0, и это означает, что он не работает, согласно документам он должен возвращать num обновленной записи:

Хотя этот метод обычно не требуется, вы можете вместо этого использовать метод, возвращающий значение типа int, указывающее количество строк, обновленных в базе данных.

Ответы [ 2 ]

0 голосов
/ 29 марта 2020

Что касается документов, в которых говорится, что вы должны сделать что-то вроде этого:

@Update 
fun updateProduct(product: Product) // no need of suspend

также вы можете контролировать, что происходит onConflict. Обратите внимание, что если вы не укажете по умолчанию, это OnConflictStrategy.ABORT, чтобы откатить транзакцию и ничего не делать. Так что вы можете добавить что-то вроде @Update(onConflict = OnConflictStrategy.REPLACE).

0 голосов
/ 22 марта 2020

Вы можете попробовать это

@Query("UPDATE products SET price=:price WHERE id = :id")
void update(Float price, int id);
...