【问题标题】:Restricted API lint error when deleting table. Room Persistence删除表时受限的 API lint 错误。房间持久性
【发布时间】:2018-01-20 18:11:51
【问题描述】:

所以我试图删除我的房间持久性表中的所有项目,这显然导致我这样做:

@Dao 
interface MyDao {
    @Query("DELETE FROM myTableName")
    public void nukeTable();
}

Stack overflow suggestion

但是,在运行 ./gradlew lint 时,我遇到了 Restricted API 故障,如下所示。

Dao_Impl.java

1.我的代码

@Dao
public interface AlertDao {

    @Insert
    void insert(List<Alert> alert);

    @Query("SELECT * FROM alert")
    List<Alert> queryAll();

    @Query("DELETE FROM alert")
    void deleteTable();
}
  1. 我的 lint 错误

受限 API ../generated/source/apt/debug/com/app/test/storage/dao/AlertDao_Impl.java:>84: SharedSQLiteStatement.acquire 只能从同一个 >library 组中调用(groupId=android.arch.persistence 。房间) 81 第82章 83 公共无效删除表(){ 84 最终 SupportSQLiteStatement _stmt = >__preparedStmtOfDeleteTable.acquire();
85 __db.beginTransaction(); 86 尝试{ 87 _stmt.executeUpdateDelete();

../generated/source/apt/debug/com/app/test/storage/dao/AlertDao_Impl.java:91:SharedSQLiteStatement.release 只能从同一个库组中调用(groupId=android.arch.持久性.房间) 88 __db.setTransactionSuccessful(); 89}终于{ 90 __db.endTransaction(); 91 __preparedStmtOfDeleteTable.release(_stmt);
92 } 93}

../generated/source/apt/debug/com/app/test/storage/dao/AlertDao_Impl.java:98:RoomSQLiteQuery 只能从同一个库组中调用(groupId=android.arch.persistence.房间) 95 @覆盖 96 公共列表 queryAll() { 97 final String _sql = "SELECT * FROM alert"; 98 最终 RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 0);
99 最终游标 _cursor = __db.query(_statement); 100 次尝试{ 101 最终 int _cursorIndexOfAutoGeneratedKey = _cursor.getColumnIndexOrThrow("autoGeneratedKey");

../generated/source/apt/debug/com/app/test/storage/dao/AlertDao_Impl.java:134:RoomSQLiteQuery.release 只能从同一个库组中调用(groupId=android.arch.持久性.房间) 131 返回_结果; 132}终于{ 133 _cursor.close(); 134 _statement.release();
135 } 136 } 137 }

任何帮助将不胜感激。

问候

【问题讨论】:

    标签: android database lint


    【解决方案1】:

    我在这里Android Architecture Component Issue Tracker 发现了一些类似的问题。根据问题,他们可能会忽略linting 中生成的代码。 Android 架构组件仍处于 alpha,因此他们正在努力修复它。

    我在我的应用程序中使用了deleteTable(),我的 DAO 看起来像

    @Query("DELETE FROM tv_show")
    void deleteTable();
    

    它对我有用,没有给出任何 lint 错误。

    D/TVShowViewModel: deleteTVShowTable: Delete
    

    确保您使用架构组件gradle最新版本,以避免任何已修复的错误。在这里找到最新版本Android Architecture Components Releases

    您现在可以在 Android Studio 项目 gradle 文件中禁用 RestrictedApi 作为解决方法

    android {
      lintOptions {
        disable 'RestrictedApi'
      }
    }
    

    【讨论】:

    • 感谢您的反馈,我将添加 lintOption,这应该有助于我的 CI。
    猜你喜欢
    • 2017-10-29
    • 2018-06-08
    • 1970-01-01
    • 2018-05-27
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 2020-03-19
    相关资源
    最近更新 更多