【问题标题】:sql lite update query list parameter issuesqlite 更新查询列表参数问题
【发布时间】:2019-12-23 11:08:10
【问题描述】:

我有一个使用这样的房间的简单 sql lite 查询。

@Query("UPDATE MYTABLE SET CAT_ID = :idCata WHERE MYTABLE_ID IN (:listIds)")
int updateAll(long idCata, String listIds);

其中 CAT_ID 定义为可为空的外键,MYTABLE_ID 是 MYTABLE 的主键。

如果我在 listIds 参数中使用一个值,则一切正常。 如果我输入“1,5”之类的内容,则不会更新数据库中的行。如果我在 listIds 中使用“1”或“5”作为单个值,一切正常。

我在 logcat 中没有任何内容或类似日志中的问题。

谁能解释一下为什么?

编辑:我发布了答案

【问题讨论】:

    标签: sqlite android-sqlite android-room


    【解决方案1】:

    我认为问题在于 1,5 将用单引号括起来并被视为字符串。所以只有值为 1,5 的行才会被更新。

    当您使用 IN 时,值应该在数组 Room 中然后构建正确的 IN 子句。所以你想要:-

     @Query("UPDATE MYTABLE SET CAT_ID = :idCata WHERE MYTABLE_ID IN (:listIds)")
     int updateAll(long idCata, String[] /*<<<<<<<<<<*/ listIds);
    
    • 显然您需要将 listIds 拆分为数组。

      int updateAll(long idCata,listIds.split(','));
    
    • 哪个做拆分

    【讨论】:

    • 你的权利,我可以使用类似@Query("SELECT * FROM user WHERE uid IN(:userIds)") public abstract List findByIds(int[] userIds); ?
    • @Zhar 我相信您只需要将字符串转换(拆分)为值的 String[]。
    【解决方案2】:

    这是解决方案,注意我使用了长数组,因为查询正在更新无法输入为字符串的外键值。 我认为它更优雅,更安全。所以最终的代码是:

    String[] ids = listIds.split(",");
    long[] idsForQuery = new long[ids.length];
    try{
        for(int i = 0; i < ids.length; i++){
            idsForQuery[i] = Long.parseLong(ids[i]);
        }
        mDao.updateAll(idCata, idsForQuery);
    }
    catch(NumberFormatException e){
        // something wrong with ids type !!
    }
    

    在 dao 中,sql lite 查询。

    @Query("UPDATE MYTABLE SET CAT_ID = :idCata WHERE MYTABLE_ID IN (:listIds)")
    int updateAll(long idCata, long[] listIds);
    

    感谢 MikeT 的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      相关资源
      最近更新 更多