Get a meaningful error message after making a basic Realm error
“Error: Objects inside a RealmObject must also extend RealmObject!” or something similar
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:compileBetaDebugJavaWithJavac'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:203)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:185)
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:66)
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:50)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:25)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:110)
at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37)
at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
at org.gradle.execution.DefaultBuildExecuter.access$000(DefaultBuildExecuter.java:23)
at org.gradle.execution.DefaultBuildExecuter$1.proceed(DefaultBuildExecuter.java:43)
at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:30)
at org.gradle.initialization.DefaultGradleLauncher$4.run(DefaultGradleLauncher.java:154)
at org.gradle.internal.Factories$1.create(Factories.java:22)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:52)
at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:151)
at org.gradle.initialization.DefaultGradleLauncher.access$200(DefaultGradleLauncher.java:32)
at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:99)
at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:93)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:62)
at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:93)
at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:82)
at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:94)
at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:28)
at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:43)
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:28)
at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:78)
at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:48)
at org.gradle.launcher.exec.DaemonUsageSuggestingBuildActionExecuter.execute(DaemonUsageSuggestingBuildActionExecuter.java:51)
at org.gradle.launcher.exec.DaemonUsageSuggestingBuildActionExecuter.execute(DaemonUsageSuggestingBuildActionExecuter.java:28)
at org.gradle.launcher.cli.RunBuildAction.run(RunBuildAction.java:43)
at org.gradle.internal.Actions$RunnableActionAdapter.execute(Actions.java:170)
at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:237)
at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:210)
at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:35)
at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:24)
at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:206)
at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:169)
at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33)
at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22)
at org.gradle.launcher.Main.doAction(Main.java:33)
at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45)
at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:54)
at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:35)
at org.gradle.launcher.GradleMain.main(GradleMain.java:23)
at org.gradle.wrapper.BootstrapMainStarter.start(BootstrapMainStarter.java:33)
at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:130)
at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:48)
Caused by: org.gradle.api.internal.tasks.compile.CompilationFailedException: Compilation failed; see the compiler error output for details.
at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:47)
at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:33)
at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.delegateAndHandleErrors(NormalizingJavaCompiler.java:101)
at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:50)
at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:36)
at org.gradle.api.internal.tasks.compile.CleaningJavaCompilerSupport.execute(CleaningJavaCompilerSupport.java:34)
at org.gradle.api.internal.tasks.compile.CleaningJavaCompilerSupport.execute(CleaningJavaCompilerSupport.java:25)
at org.gradle.api.tasks.compile.JavaCompile.performCompilation(JavaCompile.java:157)
at org.gradle.api.tasks.compile.JavaCompile.compile(JavaCompile.java:139)
at org.gradle.api.tasks.compile.JavaCompile.compile(JavaCompile.java:93)
at com.android.build.gradle.tasks.factory.AndroidJavaCompile.compile(AndroidJavaCompile.java:49)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$IncrementalTaskAction.doExecute(AnnotationProcessingTaskFactory.java:244)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:220)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$IncrementalTaskAction.execute(AnnotationProcessingTaskFactory.java:231)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:209)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
... 60 more
Error:(3, 38) error: package com.example.android.databinding does not exist). The compilation error stack trace is vague (above) and doesn't contain any reference to Realm.Realm version(s): 0.89.1
Android Studio version: 2.1 beta 3
Java 1.7.0
Thanks!
Hi @lisawray
Thanks for reporting this.
I just tested this with the latest buildtools (2.1.0) and correctly got the following errors in the log:
Users/cm/RealmCustomerProjects/flavours/app/src/main/java/com/test/myapplication/MainActivity.java:10: error: package com.test.myapplication.databinding does not exist
import com.test.myapplication.databinding.ActivityMainBinding;
^
Note: Processing class Foo
/Users/cm/RealmCustomerProjects/flavours/app/src/main/java/com/test/myapplication/Foo.java:7: error: Type android.graphics.drawable.Drawable of field dummy is not supported
public class Foo extends RealmObject {
^
Note: Creating DefaultRealmModule
warning: Unclosed files for the types '[io.realm.FooRealmProxy]'; these types will not undergo annotation processing
2 errors
1 warning
:app:compileBetaDebugJavaWithJavac FAILED
Realm model
public class Foo extends RealmObject {
public String firstName;
public String lastName;
public Drawable dummy;
public Foo() {
}
public Foo(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
Databinding part:
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
Foo user = new Foo("Test", "User");
binding.setUser(user);
I could not reproduce the error in either the 2.1.0 or 2.1.0-beta3 tools. Can you see any difference in the above compared to how you are using databinding?
Same issue when using realm and android data-binding.
Before:
public class User extends BaseObservable {
...
}
In this situation, everything works OK.
After:
@RealmClass
public class User extends BaseObservable implements RealmModel {
...
}
In this situation, compile error and generate follow error logs:
Error:(9, 43) Error: package com.example.databinding.databinding does not exist
Error:(5, 31) Error: cannot find symbol
Symbol: Class BR
Location: package com.example.databinding
So, Is there any way can support Realm and Data-binding use together?
Realm version(s): 0.89.1
Android Studio version: 2.1
@codezjx
What you are seeing is different. Realm classes only supports extending RealmObject, so you cannot extend BaseObservable. Right now there is no way to mix Realm and Data binding like that.
I just saw the realm docs said: An alternative to extending the RealmObject base class is implementing the RealmModel interface and adding the @RealmClass annotation since 0.89.0. So why we cannot extend BaseObservable? Or there may be another reson?
On the other hand, I try another way not extend BaseObservable, simple code below:
public class User extends RealmObject implements Observable {
...
@Override
public void addOnPropertyChangedCallback(OnPropertyChangedCallback onPropertyChangedCallback) {
}
@Override
public void removeOnPropertyChangedCallback(OnPropertyChangedCallback onPropertyChangedCallback) {
}
}
In this situation, compile error and generate error logs as above. And can this issue fix?
error: Type android.graphics.drawable.Drawable of field dummy is not supported
I think that's quite specific. The non-RealmObject field should be marked with @Ignore.
@cmelchior Thanks for trying -- I wonder if it's because there are so _many_ data binding errors in my project. I'll try and make a dummy project that reproduces this, but it won't be today ... understand if you have to close in the meantime
No problem, I'll keep this open.
I have tried with this simple model:
public class Exercise extends RealmObject implements Observable {
@Bindable
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private PropertyChangeRegistry mCallbacks;
@Override
public synchronized void addOnPropertyChangedCallback(OnPropertyChangedCallback callback) {
if (mCallbacks == null) {
mCallbacks = new PropertyChangeRegistry();
}
mCallbacks.add(callback);
}
@Override
public synchronized void removeOnPropertyChangedCallback(OnPropertyChangedCallback callback) {
if (mCallbacks != null) {
mCallbacks.remove(callback);
}
}
public synchronized void notifyChange() {
if (mCallbacks != null) {
mCallbacks.notifyCallbacks(this, 0, null);
}
}
public void notifyPropertyChanged(int fieldId) {
if (mCallbacks != null) {
mCallbacks.notifyCallbacks(this, fieldId, null);
}
}
But I have the same issues as above:
Error:(15, 53) error: package mypackage.databinding does not exist
I have also tried:
I see two possible problems:
I looked at the data binding annotation processor source code but I didn't find anything yet that would give me a hint.
@codezjx That is because inheritance and polymorphism are not supported yet. Also, when we will support those, you still won't be able to extend a class that is not Realm related. That is because the base class might very well contain fields whose type is not supported by Realm.
@alokhan Sorry for the delay. Can you please provide a full stacktrace?
@emanuelez
Ok i have tried again and it compiles if I extend RealObject and implement Observalbe but add @Ignore like this:
public class Exercise extends RealmObject implements Observable {
@Bindable
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Ignore
private PropertyChangeRegistry mCallbacks;
.
.
.
}
However if I try to implements RealmModel and Extends BaseObservable and use the Realm annotation @RealmClass but it gives me this:
Note: Processing class Exercise
error: Realm model classes must either extend RealmObject or implement RealmModel to be considered a valid model class
public class Exercise extends BaseObservable implements RealmModel{
^
Note: Creating DefaultRealmModule
warning: File for type 'io.realm.DefaultRealmModule' created in the last round will not be subject to annotation processing.
warning: File for type 'io.realm.DefaultRealmModuleMediator' created in the last round will not be subject to annotation processing.
7 errors
2 warnings
I saw that it is listed here: https://github.com/realm/realm-java/issues/761
@alokhan You are correct with the issue number, but even inheritance will not solve your problem since the base class (BaseObservable in this case) might contain fields whose type is not supported by Realm. So yes, your best option is to either extend RealmObject and implement Observable, or implement both RealmModel and Observable.
Ok thanks you, The best option might be implements both of them so it gives room to have a base class, what do you think ?
We still don't support extending classes that are not RealmObject.
It looks like this issue can now be closed. Please reach out if you need it re-opened! :)
So I just made this
import android.databinding.Bindable;
import android.databinding.Observable;
import android.databinding.PropertyChangeRegistry;
import com.zhuinden.realmtutorial.BR;
import com.zhuinden.realmtutorial.realm.databind.RealmDataBinding;
import io.realm.RealmObject;
import io.realm.annotations.Ignore;
import io.realm.annotations.PrimaryKey;
/*
* Created by Zhuinden on 2016.09.04..
*/
public class Post extends RealmObject implements Observable, RealmDataBinding {
@PrimaryKey
private long id;
private String text;
@Ignore
private transient PropertyChangeRegistry mCallbacks;
@Bindable
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
if(!isValid()) { // !isManaged() in Realm 2.0
notifyPropertyChanged(BR.id);
}
}
@Bindable
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
if(!isValid()) { // !isManaged() in Realm 2.0
notifyPropertyChanged(BR.text);
}
}
@Override
public synchronized void addOnPropertyChangedCallback(OnPropertyChangedCallback callback) {
if (mCallbacks == null) {
mCallbacks = new PropertyChangeRegistry();
}
mCallbacks.add(callback);
}
@Override
public synchronized void removeOnPropertyChangedCallback(OnPropertyChangedCallback callback) {
if (mCallbacks != null) {
mCallbacks.remove(callback);
}
}
/**
* Notifies listeners that all properties of this instance have changed.
*/
@Override
public synchronized void notifyChange() {
if (mCallbacks != null) {
mCallbacks.notifyCallbacks(this, 0, null);
}
}
/**
* Notifies listeners that a specific property has changed. The getter for the property
* that changes should be marked with {@link Bindable} to generate a field in
* <code>BR</code> to be used as <code>fieldId</code>.
*
* @param fieldId The generated BR id for the Bindable field.
*/
public void notifyPropertyChanged(int fieldId) {
if (mCallbacks != null) {
mCallbacks.notifyCallbacks(this, fieldId, null);
}
}
}
with
public interface RealmDataBinding {
interface Factory {
RealmChangeListener create();
}
RealmDataBinding.Factory FACTORY = () -> element -> {
if(element instanceof RealmDataBinding) {
((RealmDataBinding)element).notifyChange();
}
};
void notifyChange();
}
and it works just fine?
EDIT: I even made an article for it now that it works
https://medium.com/@Zhuinden/realm-1-2-0-android-data-binding-1dc06822287f#.kicowcuxw
@Zhuinden you mentioned in your post about this being experimental....since then have you come across gotchas or feel more confident in your code?
thanks!
@sirvon it's experimental because I never actually handled changes in a RealmList, and because I otherwise had never used data-binding, I just grabbed the relevant code for the databinding-compatible ViewHolder from elsewhere.
But it seemed to be working fine when I tried it, which is why I was confident enough to write an article about it
@RealmClass
open class Example(val name: String): RealmModel {
@PrimaryKey
var id: Long? = 1
}
I am having kind of a similar issue. I am bit new to realm and working on an existing project that uses realm. As soon as I introduced the above model, I get issues with data binding. I am unable to understand why introducing a new model can cause data binding to break in rest of the project. Any help or information on this would be greatly appreciated.
Never mind, found the issue. @Zhuinden one of your answers from stackoverflow helped me solved the issue. Really appreciate how actively you trying to help people in Realm community.
Most helpful comment
@sirvon it's experimental because I never actually handled changes in a
RealmList, and because I otherwise had never used data-binding, I just grabbed the relevant code for the databinding-compatible ViewHolder from elsewhere.But it seemed to be working fine when I tried it, which is why I was confident enough to write an article about it