使用数据绑定的Room注解处理器

8
我已经在现有代码中使用了数据绑定,现在我正在迁移到Room以实现持久化。我已经按照 Florina's Blog中的步骤进行了操作。
当我删除Room依赖项时,我的代码可以成功构建,没有Java代码错误或BR相关错误。
 annotationProcessor 'android.arch.persistence.room:compiler:1.0.0'

它也可以运行,但会出现运行时异常,提示数据库_Impl不存在。因为它无法生成该文件。

但是当我重新添加注解处理器后,它会给我

 Error:(29, 37) error: cannot find symbol class BR

我的Gradle插件使用的是com.android.tools.build:gradle:3.0.1

它们似乎无法同时工作。

迄今为止已经采取的步骤:

  1. 将BaseObservable更改为Observable 如此建议
  2. 将Android Studio更新到3.0.1
  3. 尝试使用最新的Gradle插件金丝雀版6
  4. 执行清除、清除缓存等操作

有人尝试过在Room和Data Binding一起使用吗?

3个回答

10

经过4天的努力,我终于成功让我的代码正常运行。解决步骤如下:

数据绑定错误,例如 错误:包com.packagename.databinding不存在 错误:找不到符号类CustomMainActivityBinding

必须在应用gradle中添加以下代码才能查看默认情况下出现的100多个错误。

allprojects {
gradle.projectsEvaluated {
    tasks.withType(JavaCompile) {
        options.compilerArgs << "-Xmaxerrs" << "4000"
        options.compilerArgs << "-Xmaxwarns" << "4000"
    }
  }
}

用于数据绑定和 Room 架构组件的 Gradle 依赖项。

annotationProcessor 'com.android.databinding:compiler:3.0.1'

implementation 'android.arch.lifecycle:extensions:1.0.0'
implementation 'android.arch.persistence.room:runtime:1.0.0'
annotationProcessor 'android.arch.lifecycle:compiler:1.0.0'
annotationProcessor 'android.arch.persistence.room:compiler:1.0.0'
注意:Gradle插件版本为3.0.1
我将所有的虚拟机都更改为实现Observable并调用。
registry.notifyChange(this, BR.bar);

在通知更改的情况下并实现重写方法

@Override
public void addOnPropertyChangedCallback(OnPropertyChangedCallback    
callback) {
registry.add(callback);
}

@Override
public void removeOnPropertyChangedCallback(
OnPropertyChangedCallback callback) {
registry.remove(callback);
}

这些问题让我的代码可以被构建,但是只有在我解决了与 Room 查询相关的错误后,它才能运行而没有任何异常。这也是代码能够构建但无法运行的主要原因。我可以在重新构建项目时看到这些错误,使用Rebuild操作即可。

更新:

Android Studio 3.1.3之后,Message窗口消失了,现在所有构建错误都出现在Build视图下。虽然有开关可以获取错误的文本视图响应,但对于数据绑定错误来说这是不够的。

帮助我的解决方案:

  1. 在命令提示符/终端中导航到项目根目录。
  2. 如果您使用的是Mac,则运行此命令“./gradlew build --stacktrace”,如果您使用的是Windows,则运行“.\gradlew build --stacktrace”。
  3. 现在搜索“error:”标签,编译时错误将显示出来。

我无法在IDE中找到这些错误。


1
非常感谢,你救了我的命))) - Hossein Shahdoost
你调用的注册表对象是什么? - Christian
@Christian 私有瞬态 PropertyChangeRegistry registry = new PropertyChangeRegistry(); - xrnd
./gradlew build --stacktrace 对我很有帮助。 Android Studio 没有显示所有的错误。 - bentesha
你好 @DeeshaV ,我也自昨天开始遇到这个问题,但还没有找到解决方法。我正在使用androidX,所以无法使用你的依赖项。如果你有关于androidX的解决方案,请帮忙一下。 - Shubham Anand
我在模型类中没有添加主键,所以才会出现错误。 - Shubham Anand

0
根据我的经验,以下原因可能导致错误:
  1. Getter/Setter不正确(名称缺失或不正确)
  2. Dao中返回类型不正确
  3. annotationProcessor或kapt问题
  4. 默认构造函数被覆盖(需要为Room保留空构造函数)

0
我在添加房间依赖项时遇到了这个问题。按照以下方式添加以解决错误。
 def roomVersion = "2.0.0-rc01"
implementation "android.arch.persistence.room:runtime:$roomVersion"
annotationProcessor "android.arch.persistence.room:runtime:$roomVersion"
annotationProcessor "android.arch.persistence.room:compiler:$roomVersion"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接