【问题标题】:Room error: no viable alternative at input?房间错误:输入时没有可行的替代方案?
【发布时间】:2017-08-08 18:47:54
【问题描述】:

我正在尝试使用房间库的@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;
    }
}

我的代码有什么问题?

【问题讨论】:

  • 您可以编辑您的问题并使用定义table_name@Entity 注释显示您的Java 类吗?
  • @CommonsWare 我已经编辑了问题,请看一下,谢谢
  • 尝试将您的声明更改为UPDATE table_name SET col1 = :val1 WHERE col2 = :val2。在这种情况下,您不需要表前缀,并且错误消息让人感觉 Room 被前缀绊倒了。
  • @CommonsWare 你是绝对正确的我删除了 table_name 并且错误消失了,谢谢。我没想到会有这样的行为。谢谢。
  • 老实说,这感觉就像是房间虫子。如果您可以创建一个用作可重现测试用例的项目,请file an issue 并在那里上传示例项目。如果您认为自己没有时间这样做,请告诉我,我会看看能不能一起扔东西。

标签: android android-room


【解决方案1】:

在这种情况下也可能发生此错误:

如果你传递一个列表,不要忘记在你的列表变量中加上括号,否则你会得到同样的错误:

@Query("select name from mytable where name in (:myList)")
LiveData<List<String>> findNames(List<String> myList);

【讨论】:

  • 这真的很有帮助! :D
【解决方案2】:

尝试将您的语句更改为:

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

错误消息让人感觉 Room 被前缀绊倒了。

这是 Room 中的一个错误,至少在 1.0.0-alpha8 中是这样。跟踪 this issue 以查看何时修复。

这实际上不是有效的 SQLite 语法,as it turns out。表前缀出现在SELECT 语句、not UPDATE statements 中的列上。

【讨论】:

    【解决方案3】:

    在我的例子中,一条消息是error: no viable alternative at input 'is'(并提到了一个查询名称)。我发现查询中的单词之间没有必要的空格,如下所示:

        "from car" +       // Add a space here.
        "where brand_id is null" +
    

    【讨论】:

      猜你喜欢
      • 2021-08-25
      • 2016-01-14
      • 2022-11-04
      • 2013-08-26
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多