Ошибка помещения: нет альтернативы на входе?

Я пытаюсь обновить таблицу, используя аннотацию @Query библиотеки комнаты, ниже мой код (в интерфейсе Dao):

@Query("UPDATE table_name SET table_name.col1 = :val1 WHERE table_name.col2 = :val2")
void updateValue(long val1, long val2);

Заполните строку ошибки, как показано ниже:

Error:(11, 10) error: no viable alternative at input 'UPDATE table_name SET table_name.'

Вот класс сущности:

@Entity(tableName = "table_name")
public class SampleTable {

    @PrimaryKey
    @ColumnInfo(name = "_id")
    private Long Id;

    @ColumnInfo(name = "col1")
    private Long column1;

    @ColumnInfo(name = "col2")
    private Long column2;

    public Long getId() {
        return Id;
    }

    public void setId(Long id) {
        Id = id;
    }

    public Long getColumn1() {
        return column1;
    }

    public void setColumn1(Long column1) {
        this.column1 = column1;
    }

    public Long getColumn2() {
        return column2;
    }

    public void setColumn2(Long column2) {
        this.column2 = column2;
    }
}

Что не так с моим кодом?


person Prashant    schedule 08.08.2017    source источник
comment
Можете ли вы отредактировать свой вопрос и показать свой класс Java с аннотацией @Entity, определяющей table_name?   -  person CommonsWare    schedule 08.08.2017
comment
@CommonsWare Я отредактировал вопрос, пожалуйста, посмотрите, спасибо   -  person Prashant    schedule 08.08.2017
comment
Попробуйте изменить свое выражение на UPDATE table_name SET col1 = :val1 WHERE col2 = :val2. В этом случае вам не нужен префикс таблицы, а из сообщения об ошибке создается впечатление, что Room споткнулся о префикс.   -  person CommonsWare    schedule 08.08.2017
comment
@CommonsWare, вы абсолютно правы, я удалил table_name, и ошибка исчезла, спасибо. Я не ожидал такого поведения. Спасибо.   -  person Prashant    schedule 08.08.2017
comment
Честно говоря, это похоже на ошибку в номере. Если у вас есть возможность создать проект, который служит воспроизводимым тестовым примером, сообщите о проблеме. и загрузите туда образец проекта. Если вы не думаете, что у вас будет на это время, дайте мне знать, и я посмотрю, смогу ли я что-нибудь подбросить.   -  person CommonsWare    schedule 08.08.2017
comment
Конечно, я могу подать эту проблему, спасибо за предложение, у меня есть этот образец экспериментального table_name, который я могу использовать для создания образца, тогда я сообщу об ошибке.   -  person Prashant    schedule 08.08.2017


Ответы (3)


Попробуйте изменить свое утверждение на:

UPDATE table_name SET col1 = :val1 WHERE col2 = :val2.

Из-за сообщения об ошибке создается впечатление, что Room перешагнул через префикс.

Это ошибка в комнате, по крайней мере, до 1.0.0-alpha8. Отслеживайте эту проблему, чтобы узнать, когда она будет устранена.

На самом деле это недопустимый синтаксис SQLite, как оказалось, . Префиксы таблиц помещаются в столбцы в SELECT операторах, не UPDATE в операторах.

person CommonsWare    schedule 09.08.2017

Эта ошибка также могла произойти в этом случае:

Если вы передаете список, не забудьте добавить круглые скобки, заключающие вашу переменную списка, иначе вы получите ту же ошибку:

@Query("select name from mytable where name in (:myList)")
LiveData<List<String>> findNames(List<String> myList);
person live-love    schedule 03.06.2018
comment
Это действительно помогло! : D - person bplpu; 31.07.2018

В моем случае сообщение было error: no viable alternative at input 'is' (и было упомянуто имя запроса). Я обнаружил, что в запросе нет необходимых пробелов между такими словами, как здесь:

    "from car" +       // Add a space here.
    "where brand_id is null" +
person CoolMind    schedule 22.08.2018