【问题标题】:Android Room @Delete with parametersAndroid Room @Delete 带参数
【发布时间】:2018-05-12 08:09:39
【问题描述】:

我知道我不能在查询中使用DELETE(顺便说一句,这很遗憾),我会收到以下错误:

<i>Error:error: Observable query return type (LiveData, Flowable etc) can only be used with SELECT queries that directly or indirectly (via @Relation, for example) access at least one table.</i>

但我不能使用@Delete(WHERE... xxx) 那么如何通过参数删除特定行呢?

【问题讨论】:

    标签: java android sql android-room


    【解决方案1】:

    其实你可以使用@Query进行删除。

    @Query("DELETE FROM users WHERE user_id = :userId")
    abstract void deleteByUserId(long userId);
    

    摘自Query javadoc:

    UPDATE 或 DELETE 查询可以返回 void 或 int。如果是 int,则 value 是受此查询影响的行数。

    【讨论】:

    • 这行得通,我一直在使用类似的东西,delete all 也是这样写的。供参考检查:(stackoverflow.com/a/44249498/2185548)
    • @Delete 出于某种原因对我不起作用。但这行得通!
    • @Rakesh 您的实体中可能有一个自动生成的主 ID,这意味着您只能删除使用某些参数,例如此处的“userId”。
    • 两个问题,因为我有一个自动生成的主 ID,这意味着即使对于我的更新方法我也必须使用一个 ID,delete(normal) 和 delete 之间有什么区别有id 查询?
    • 感谢@Maragues 提供的信息。 “UPDATE 或 DELETE 查询可以返回 void 或 int。如果是 int,则该值是受此查询影响的行数。”东西是我一直在寻找的。它对我有用。
    【解决方案2】:

    房间的美妙之处在于,我们在玩物。根据要求,您可以使用 对于科特林:

    @Delete
    fun delete(model: LanguageModel)
    

    对于 Java:

    @Delete
    void delete(LanguageModel model)
    

    它将删除存储在数据库中的具有相同值的确切对象。 LanguageModel 是我的模型类,它运行良好。

    【讨论】:

    • 只是一个小观察:The documentation 仅提及 @Delete 注释方法的主键匹配。如果模型中没有主键定义会发生什么,有点不清楚。
    • 如果要“删除存储在数据库中的具有相同值的确切对象”,那将是无用的,因为对象在数据库中发生了变化,以后删除它们不应该需要我知道他们的确切数据;我只需要知道主键。
    • @dbm roomdb 中的实体中至少需要一个主键
    • @AndroidLearner 这实际上是一个有效的观点。未来访问者的文档快捷方式:developer.android.com/training/data-storage/room/defining-data
    【解决方案3】:

    您可以使用以下方法按ID删除

    @Query("DELETE FROM yourDatabaseTable WHERE id = :id")
    void deleteById(int id);
    

    删除所有行

    @Query("DELETE FROM yourDatabaseTable")
    void delete();
    

    【讨论】:

    • 嗨!使用第二种方法删除数据库,是否可以返回一个值(真或假)是否删除成功或注意?谢谢!
    • @MarkDelphi 如果delete 操作成功,它将返回已删除的行数。所以返回-1 意味着操作失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    • 2013-07-23
    • 1970-01-01
    相关资源
    最近更新 更多