java - Room - 编译器消息文件损坏
问题描述
我正在尝试将 Room 持久性库添加到 Android 应用程序项目中。在build.gradle文件中,我添加了以下依赖项:
implementation 'android.arch.persistence.room:runtime:1.1.1'
annotationProcessor 'android.arch.persistence.room:compiler:1.1.1'
并在应用程序的 onCreate 方法中初始化它:
static FilmsDao sFilmsDao;
@Override
public void onCreate() {
super.onCreate();
// Realm.init(this);
FilmsDatabase database = Room.databaseBuilder(this, FilmsDatabase.class, "films_database")
.fallbackToDestructiveMigration()
.build();
sFilmsDao = database.getFilmsDao();
}
public static FilmsDao getFilmsDao(){
return sFilmsDao;
}
FilmsDao 看起来像这样:
@Dao
public interface FilmsDao {
@Query("delete from film")
void clearDatabase();
@Query("select * from film where id = :id")
Film getItem(long id);
@Query("select * from film")
List<Film> getAll();
@Query("select * from film where name LIKE :name")
List<Film> searchByName(String name);
@Query("select * from film where director LIKE :query")
List<Film> searchByDirector(String query);
@Query("select * from film where year>=:startYear AND year<=:endYear")
List<Film> searchInBounds(int startYear, int endYear);
@Query("select * from film ORDER BY rating DESC LIMIT :count")
List<Film> getTopFilms(int count);
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertItem(Film film);
@Update(onConflict = OnConflictStrategy.REPLACE)
void updateItem(Film film);
@Query("delete from film where id = :id")
void deleteItem(long id);
}
FilmsDatabase 返回 FilmsDao:
@Database(entities = {Film.class}, version = 1)
public abstract class FilmsDatabase extends RoomDatabase {
public abstract FilmsDao getFilmsDao();
}
当我尝试运行应用程序时,出现以下错误:
编译失败;有关详细信息,请参阅编译器错误输出。
它包含 1 个警告和 2 个错误。
警告:
有多个好的构造函数,Room 会选择无参数的构造函数。您可以使用 @Ignore 注释来消除不需要的构造函数。
错误一:
错误:编译器消息文件损坏:key=compiler.err.Processor:android.arch.persistence.room.RoomProcessor@5334315d arguments={0}、{1}、{2}、{3}、{4}、{5 }、{6}、{7}
错误2:
错误:无法访问 Flowable
详细错误信息:
org.gradle.api.tasks.TaskExecutionException:任务':app:compileDebugJavaWithJavac'的执行失败。在 org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70) 在 org.gradle. .api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51) 在 org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:62) 在 org.gradle.api.internal .tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54) 在 org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter。581)在 org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63) 在 org.gradle.internal .concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55) at java.lang.Thread.run(Thread.java:745) 引起:org.gradle.api.internal.tasks.compile .CompilationFailedException:编译失败;有关详细信息,请参阅编译器错误输出。在 org.gradle.api.internal.tasks.compile。
所以我的问题是:如何解决这个问题?
解决方案
的定义Film
将是这里唯一相关的文件...因为它可能包含多个构造函数,其中除了默认构造函数之外的所有构造函数都需要用@Ignore
; 字段也是如此,注释处理器不应处理这些字段。一般来说,它只是抱怨有多个构造函数可供选择,因此它不知道该怎么做……通过添加进一步的注释来要求澄清。
推荐阅读
- python - 使用 pandas 重新分配项目会产生错误的结果
- javascript - amCharts 地图在页面刷新时未加载圆圈
- python - 如何更改、添加或删除标签的属性
- python - Python:如何从数组中提取值的第一个实例并将其存储在列表中?
- javascript - 从 iid.google api 获取时从 google apis 没有响应时使用 firebase 云消息传递为 web
- javascript - 错误:agent.add() 函数不起作用,即没有向用户获取输出值。在 Google 助手中
- ruby-on-rails - Rails - 如何使用新创建的对象更新数据库中的现有记录
- sql - 如何通过 DB Link 调整删除操作
- oracle - 如何确保两个同时的 pl/sql 事务相互等待或知道另一个
- module - 在 .py 文件中导入函数并通过调用 function_name 使用它们