Realm.io/Dagger/Привязка данных в том же проекте

У меня возникли проблемы с компиляцией моего проекта после того, как я добавил Realm.io в качестве зависимости через gradle. Сгенерированные файлы, созданные кинжалом и привязкой данных, не могут быть найдены. Если я удалю realm.io, приложение скомпилируется правильно.

Вот мой build.gradle

apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
apply plugin: 'com.android.databinding'

android {
compileSdkVersion 23
buildToolsVersion "23.0.2"

defaultConfig {
    multiDexEnabled true
    applicationId "com.foo"
    minSdkVersion 15
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.1.0'
compile 'com.facebook.stetho:stetho:1.2.0'
compile 'com.facebook.stetho:stetho-okhttp:1.2.0'
compile 'io.reactivex:rxandroid:0.24.0'
compile 'io.reactivex:rxjava:1.0.14'
compile 'com.squareup.okhttp:okhttp:2.4.0'
compile 'com.squareup.okhttp:okhttp-urlconnection:2.4.0'
compile 'com.squareup.retrofit:retrofit:1.9.0'
compile 'com.squareup.okio:okio:1.4.0'
compile 'com.google.code.gson:gson:2.3'
compile 'com.jakewharton:butterknife:6.1.0'
compile 'com.android.support:recyclerview-v7:23.1.0'
compile 'com.squareup.picasso:picasso:2.3.2'
compile 'com.android.support:cardview-v7:23.1.0'
compile 'com.android.support:multidex:1.0.1'
compile 'com.android.support:design:23.1.0'
compile 'com.jakewharton.timber:timber:4.1.0'
compile 'io.realm:realm-android:0.85.1'

compile 'com.google.dagger:dagger:2.0.1'
provided 'javax.annotation:jsr250-api:1.0'
apt "com.google.dagger:dagger-compiler:2.0.1"
apt 'com.android.databinding:compiler:1.0-rc4'
}

Ошибка

Я вижу, что Realm также генерирует файлы, и, возможно, компиляторы не работают вместе. Любые идеи о том, как заставить это работать?

Спасибо


person Darussian    schedule 25.11.2015    source источник
comment
Да, процессор аннотаций Realm создает прокси-классы, которые также компилируются во время сборки. На скриншоте видно, что ошибки связаны с другими классами, а не с Realm. Создается ли ваше приложение, если вы удаляете Realm?   -  person geisshirt    schedule 26.11.2015
comment
Да, я удаляю область, приложение работает нормально   -  person Darussian    schedule 27.11.2015


Ответы (4)


Я вижу, что вы также получили сообщение об ошибке:

Не найден сеттер для поля targetInfo

Убедитесь, что имена полей такие же, как у геттеров и сеттеров. Не добавляйте «m» к именам полей. Пример:

@RealmClass
public Goal extends RealmObject {
    //private String mGoalInfo;
    private String goalInfo;

    public String getGoalInfo() {
        return goalInfo;
    }

    public void setGoalInfo(String goalInfo) {
        this.goalInfo = goalInfo;
    }
}
person Community    schedule 17.01.2016

Привязка данных работает с RealmObjects, но вы должны реализовать Observable.

public class Post extends RealmObject implements Observable {
    @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.
     */
    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);
        }
    }
}

А Dagger+Databinding могут сломать друг друга, для чего нужно добавить

apt 'com.google.guava:guava:19.0' // dagger + databind workaround
person EpicPandaForce    schedule 04.09.2016
comment
Не работает. Он показывает ту же ошибку. Пакет не существует. - person Luvnish Monga; 17.01.2017
comment
@LuvnishMonga, это, вероятно, означает, что у вас где-то есть ошибка в коде. - person EpicPandaForce; 17.01.2017
comment
Код работает нормально. Я использую только Databinding и Realm. Когда мой класс модели распространяется на RealmObject, он показывает ту же ошибку, с которой сталкивается @Darussian. Когда я реализовал ваш код, он показывает мне ту же ошибку. - person Luvnish Monga; 18.01.2017
comment
@EpicPandaForce Когда мы должны использовать implements Observable, implements RealmBaseObservable, implements Observable, RealmBaseObservable? - person Dr.jacky; 23.12.2017
comment
Что такое RealmBaseObservable? Однако интерфейс RealmDataBinding был добавлен для поддержки прослушивания управляемых объектов. - person EpicPandaForce; 23.12.2017

В моем проекте работают Realm, Dagger2 и Databinding.

Разница в следующем:

Я использую плагин Android Gradle 1.5.0 и включаю привязку данных, используя следующую конфигурацию.

android {
    ...
    dataBinding {
        enabled = true
    }
    ...
}

И у меня нет

apt 'com.android.databinding:compiler:1.0-rc4'

в зависимостях.

Весь рабочий проект здесь: https://github.com/zaki50/realm_template

person zaki50    schedule 27.11.2015
comment
После обновления плагина Android Gradle до 2.0.0 и области до 0.88.3, ​​сможете ли вы добиться успеха? - person codezjx; 04.05.2016

Теперь можно реализовать интерфейс RealmModel и добавить к классу аннотацию @RealmClass вместо расширения RealmObject. Это позволяет вам расширять BaseObservable, однако он все еще не работает.

Вы получаете сообщение об ошибке привязки данных: пакет mypackage.databinding не существует

См. этот выпуск на github: https://github.com/realm/realm-java/issues/2716

person Alois    schedule 08.05.2016