【问题标题】:Cannot resolve method realm.insert and realm.copyFromRealm无法解析方法 realm.insert 和 realm.copyFromRealm
【发布时间】:2018-01-01 19:19:15
【问题描述】:

我的目标是在 RecyclerAdapter 中显示从 Internet 接收到的数据。但是当我尝试这样做时,我得到了一个例外。我试着做这个代码

myService.getFromNet(name)
            .subscribeOn(Schedulers.io())
            .map(Cook::getPizza)
            .flatMap(cooks -> {
                Realm.getDefaultInstance().executeTransaction(realm -> {
                    realm.delete(PizzaViewDB.class);
                    //But here there is an error
                    realm.insert(cooks);
                });
                return io.reactivex.Observable.just(cooks);
            })
            .onErrorResumeNext(throwable -> {
                Realm realm = Realm.getDefaultInstance();
                RealmResults<PizzaViewDB> results = realm.where(PizzaViewDB.class).findAll();
                //And below is problem - reason: no instance(s) if type variable(s) E exist to that List<E> comforms to String
                return io.reactivex.Observable.just(realm.copyFromRealm(results));
            })
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(re -> {
                recyclerView.setAdapter(new CookAdapter(cook.getPizza()));
            });

但我仍然有一个例外。我在这里使用 RealmList 的基类:

@SerializedName("pizza")
@Expose
private RealmList<PizzaViewDB> pizza;

public RealmList<PizzaViewDB> getPizza() {
    return pizza;
}

还有我来自 Realm 的字段:

public class PizzaViewDB extends RealmObject implements RealmModel {
@PrimaryKey
private String subject;
private String comment;
private String date;

public void setSubject(String subject) {
    this.subject = subject;
}

public void setDate(String date) {
    this.date = date;
}

public void setComment(String name) {
    this.comment = name;
}

public String getSubject() {
    return subject;
}

public String getDate() {
    return date;
}

public String getComment() {
    return comment;
}

【问题讨论】:

  • 这很可能意味着您使用的 Realm 版本早于 0.87.0(最新版本是 4.3.1)

标签: android realm rx-java


【解决方案1】:

realm.copyFromRealm() 是在 0.87.0 中添加的(insert() 是在 1.1.0 中添加的),因此您使用的是比该版本更旧的版本。您很可能在您的依赖项中有这个(在您的模块级 gradle 文件中:

dependencies {
    compile 'io.realm:realm-android:0.82.2' 
    // up to 0.87.5, although you have something older than 0.87.0
}

相反,您应该拥有以下内容,尤其是如果这是一个新项目:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "io.realm:realm-gradle-plugin:4.3.1"
    }
}

apply plugin: 'com.android.application'
...
apply plugin: 'realm-android'

如果这是一个使用旧版本 Realm 的旧项目,您可能需要仔细阅读 my version migration guide


顺便说一句,随着时间的推移,您的代码将有大量的cryptic errors,所以您应该如何修复它(使用 try-with-resources):

        .flatMap(cooks -> {
            try(Realm realm = Realm.getDefaultInstance()) {
                realm.executeTransaction(r -> {
                    r.delete(PizzaViewDB.class);
                    //But here there is an error
                    r.insert(cooks);
            });
            return io.reactivex.Observable.just(cooks);
        })
        .onErrorResumeNext(throwable -> {
            try(Realm realm = Realm.getDefaultInstance()) {
                // you *might* need realm.refresh() here but probably not
                RealmResults<PizzaViewDB> results = realm.where(PizzaViewDB.class).findAll();
                return io.reactivex.Observable.just(realm.copyFromRealm(results));
            }
        })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 2015-06-10
    相关资源
    最近更新 更多