Room annotation processor with Data binding

2020-02-23 04:04发布

I have used Data binding in my existing code and now I am migrating to Room for persistence. I have followed the steps mentioned in Florina's Blog for room

My Code builds fine without java code error or BR related error when I remove room dependency

 annotationProcessor 'android.arch.persistence.room:compiler:1.0.0'

and its runs too, but gives Runtime exception saying database_Impl does not exists. As it couldn't generate that's file.

But after I put Annotation processor back, it give me

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

My gradle plugin used is com.android.tools.build:gradle:3.0.1

They both don't seem to work together

Steps taken so far:

  1. Changed BaseObservable to Observable As suggested here
  2. Updated Android Studio to 3.0.1
  3. Tried using gradle latest plugin canary 6
  4. Clear, Clear Cache also done

Has anyone used Room and Data binding together ?

2条回答
戒情不戒烟
2楼-- · 2020-02-23 04:26

After 4 days of efforts I finally made my code run properly. Steps to solve the

Data binding error like error: package com.packagename.databinding does not exist error: cannot find symbol class CustomMainActivityBinding

The app gradle must have below code added in order to view more than 100 errors that come by default

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

Gradle dependencies for data binding and Room arch components

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'

Note: Gradle plugin version is 3.0.1

I changed my all VMs to implement Observable and call

registry.notifyChange(this, BR.bar);

in case of notify change and also implement overridden methods

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

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

These things made my code Build, but it run without exceptions when I solved the Room query related errors. Which was the main reason, code was building but not running. These errors I could see when I Rebuid my project again.

UPDATE:

After Android studio 3.1.3, Message window is gone and now all build error appears under Build view. Although there is toggle available to get textview response of error, for data-binding errors it isn't sufficient.

Solution that helped me:

  1. In Command promt/Terminal navigate to project root.
  2. Run this command "./gradlew build --stacktrace" if Mac or ".\gradlew build --stacktrace" if Windows.
  3. Now search for "error:" tag and the compile time errors will show up.

I couldn't get these errors in IDE.

查看更多
Emotional °昔
3楼-- · 2020-02-23 04:37

In my experience, the following reasons may cause the error:

  1. Incorrect getter/setter (missing or incorrect name)
  2. Incorrect return type in Dao
  3. annotationProcessor or kapt issues
  4. The default constructor is overridden (you need to keep the empty constructor for Room)
查看更多
登录 后发表回答