【问题标题】:Room - SQLiteLog: (1) too many SQL variablesRoom - SQLiteLog:(1)SQL变量太多
【发布时间】:2018-04-19 10:43:37
【问题描述】:

我有一个包含大约 10,000 条记录的表。

例如,我有以下实体:

@Entity(tableName="cupcakes")
public class CupcakeEntity {

  @PrimaryKey(autoGenerate = true)
  @ColumnName(name = "id")
  long id;

  @ColumnName(name = "name")
  String name;

  @ColumnName(name = "parent_id")
  Long parentId;
}

然后,我自行加入CupcakeEntity 这个班级:

public class CupcakeModel {

  @Embedded
  CupcakeEntity cupcake;

  @Relation(parentColumn = "id", entityColumn = "parent_id")
  List<CupcakeEntity> parent;
}

当我使用 SQL 语句获取 CupcakeModel 时:

SELECT * FROM cupcakes WHERE name LIKE '%' || :keyword || '%'

查询会抛出以下异常:

too many SQL variables (code 1): , while compiling: 
SELECT id,name,parent_id FROM `cupcakes` WHERE parent_id IN
(?,?,?,?...............................

我查看了 Room 生成的代码,发现它正在循环所有实体。

除了创建我自己的 JOIN 语句之外,还有其他解决方法吗?

【问题讨论】:

  • 您可以尝试使用LIMIT 或其他东西来限制您获得多少CupcakeModel 实例。我对您的错误的解释是您的查询返回了很多纸杯蛋糕,而 Room 试图在一个查询中获取所有父母。理想情况下,Room 会更好地处理这个问题(分批加载父母)——如果您可以轻松创建可重现的测试用例,您可能会考虑提交功能请求。
  • 我会尝试使用LIMIT
  • LIMIT 成功了!谢谢@CommonsWare

标签: android sqlite android-room


【解决方案1】:

我会在这里留下这个答案,以防有人遇到这个问题。

按照@CommonsWare 的建议,我在查询中添加了LIMIT,现在看起来像:

SELECT * FROM cupcakes WHERE name LIKE '%' || :keyword || '%' LIMIT 500

感谢@CommonsWare 提供此解决方法。

【讨论】:

    【解决方案2】:

    在下面的查询中使用 ..

        @Query("SELECT * FROM MyTable WHERE name LIKE '%' || :arg0 || '%'")
    List<MyTable> getData(String arg0);
    

    【讨论】:

    • 这与我执行的查询相同,只是我使用了不同的模型作为结果,因为我使用的是@Embedded@Relation
    • @AndroidTeam,这不是问题的答案。请仔细阅读问题并作出回应。
    猜你喜欢
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 2016-09-07
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多