使用Dagger,Room和LiveData

时间:2017-10-25 19:27:08

标签: android android-room dagger android-livedata

在我的Android项目中,我使用的是Android Studio 3.0-beta6,用于休息调用的retrofit2,用于持久性的Room,用于使用RxJava / RxAndroid进行反应式编程的LiveData。有几个annotationProcessors在使用:

  1. android.arch.lifecycle:编译器
  2. android.arch.persistence.room:compiler
  3. com.google.dagger:匕首编译
  4. com.google.dagger:匕首机器人处理器
  5. org.projectlombok:Lombok的
  6. 每次我添加一个新的Retrofit2服务,带有Room annotations的模型类,Room Dao类我发现我遇到了数据绑定生成错误:

    Error:(3, 27) error: cannot find symbol class DataBindingComponent

    一个巨大的"列表找不到符号"错误被释放但我的问题的根本原因通常不会被发出。调试根本原因需要花费大量时间,因为错误报告似乎非常弱。

    在这里被烧了好几次后,我会用一些策略来解决这种情况下的问题:

    1. 搁置我的更改并以小增量介绍更改,并在吹掉我的应用程序的构建和架构输出文件夹后执行干净的重建。通常,这意味着首先引入模型类更改。接下来介绍Room所需的Jackson转换器,以便在我的Room Entity模型类中保留非原始类型。最后介绍了Dao类和Room Database子类。
    2. 检查实体类以确保它们具有@PrimaryKey,@ Entity,@ TypeConverters Room注释。确保TypeConverter类指定转换器类FooConverter而不是要转换的类Foo
    3. 检查Dao类以确保@Query annotation
    4. 中的tablename中没有复制粘贴错误

      然而,有时候我仍然遇到数据库生成错误,根本原因未知。

      我想知道是否有任何好的技术来隔离这种acsenario的根本原因。有没有办法在注释处理器(特别是Room)中打开调试日志记录。

      TIA对此有任何指导。我怀疑很多人都面临这种情况。

3 个答案:

答案 0 :(得分:4)

以下技术在Android Studio的“消息”面板中提供了有关我在Dao类中的问题的有意义错误。它告诉我,我在Room @Query注释中的表名中输入了一个拼写错误。更明确的信息是我通过build.gradle更改了java编译器发出的最大错误数。

我在build.gradle的末尾添加了以下代码:

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

希望这有助于其他人。

答案 1 :(得分:1)

是的,问题在于Dagger,Databinding和Room使用注释处理器。这意味着一个代码生成器在处理另一个代码生成时会出现问题。

Ive added an issue long time ago。 Google团队希望改进这一点,但通常您可以直接在顶部查看gradle日志中的错误。

在对这些库进行一些开发之后,您会发现问题很简单。

答案 2 :(得分:-1)

在build.gradle模块级别使用...

apply from: 'buildsystem/dependencies.gradle'

buildscript {
    ext.kotlin_version = '1.1.51'

    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        //classpath "com.google.dagger:dagger-compiler:2.8"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }


}

task clean(type: Delete) {
    delete rootProject.buildDir
}

在您的项目build.gradle

browser = webdriver.Firefox()