在库中使用realm.io时出现NoSuchMethodError

时间:2016-08-15 07:09:16

标签: java android realm

我按照realm.io Java文档部分Sharing schemas中所述的建议,将我的Android应用程序的模型类转移到了一个库中,并将其包含在库中。 当我的应用程序(间接)调用库中的realm.io方法时,我正面临NoSuchMethodError。

java.lang.NoSuchMethodError: No static method copyOrUpdate(Lio/realm/Realm;Lmy/package/structure/MyModelClass;ZLjava/util/Map;)Lmy/package/structure/MyModelClass; in class Lio/realm/MyModelClassRealmProxy; or its super classes (declaration of 'io.realm.MyModelClassRealmProxy' appears in /data/user/0/my.name.space/files/.jrebel/load-dexes/bundle3/classes.zip) 
  at io.realm.MyModuleMediator.copyOrUpdate(MyModuleMediator.java:98)
  at io.realm.Realm.copyOrUpdate(Realm.java:1164)
  at io.realm.Realm.copyToRealmOrUpdate(Realm.java:757)

以下是我的图书馆的样子:

build.gradle(项目)

buildscript {
  repositories {
      jcenter()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:2.1.2'
    classpath 'io.realm:realm-gradle-plugin:1.0.1'        
  }
}

build.gradle(图书馆模块)

apply plugin: 'com.android.library'
apply plugin: 'realm-android'
...
buildTypes {
    release {
        minifyEnabled false
        signingConfig signingConfigs.release
        proguardFile getDefaultProguardFile('proguard-rules.pro')
    }
}
...

proguard-rules.pro

我使用this snippet作为模板

-keep class io.realm.annotations.RealmModule
-keep @io.realm.annotations.RealmModule class *
-keep class io.realm.internal.Keep
-keep @io.realm.internal.Keep class * { *; }
-keep my.package.MyModelClass
-dontwarn javax.**
-dontwarn io.realm.**

MyModule.java

package my.package;

import io.realm.annotations.RealmModule;

@RealmModule(library = true, allClasses = true)
public class MyModule { }

MyRealm.java

package my.package;

import ...

public class MyRealm {
    private final RealmConfiguration realmConfig;

    public MyRealm(Context context) {
        realmConfig = new RealmConfiguration.Builder(context)
                .name("name.of.my.config")
                .modules(new MyModule())
                .build();
    }

    public Realm getRealm() {
        return Realm.getInstance(realmConfig);
    }
}

MyModelClass.class

package my.package;

import ...

public class MyModelClass extends RealmObject {

  public void save(Context context) {
    Realm realm = new MyRealm(context).getRealm();
    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm bgRealm) {
            bgRealm.copyToRealmOrUpdate(MyModelClass.this);
        }
    });
    realm.close();
  }
}

在我的实际应用程序中,我调用了类似这样的异常:

MyActivity.java

// ...
MyModelClass c = new MyModelClass();
c.save(context);

当所有内容都在应用程序项目中时,上面的代码运行良好。

我错过了一般的东西吗? 关于lib的proguard设置,还有什么我需要考虑的吗? May JRebel会引起这种问题吗?

3 个答案:

答案 0 :(得分:2)

我认为您可能没有正确使用它,我建议您看到一个完整的工作示例,例如他们引用的那个是Sharing Schemas链接的结尾。该链接指向此存储库full working example of realm lib and app。我建议您查看库中的Zoo class,这些方法是唯一暴露给应用程序的方法,因为您可以看到in the app's activity here(第148行及以下)。

我认为这只是你的一个混乱,因为根据我的理解你正在调用你的库类并使用它就像它是一个Realm实例的那个活动上下文而不是这样。希望这可以引导你走上正确的道路!

基本上你只是根据你的配置创建一个实例,所以你不需要在那里传递一个上下文。

答案 1 :(得分:1)

对于JRebel会发生这种情况,如果问题仍然存在,我建议您尝试使用最新版本的尝试不要使用它。

答案 2 :(得分:0)

我收到了与原帖相同的错误消息。

java.lang.NoSuchMethodError: No static method copyOrUpdate(Lio/realm/Realm;Lmy/package/structure/MyModelClass;ZLjava/util/Map;)Lmy/package/structure/MyModelClass; in class Lio/realm/MyModelClassRealmProxy; or its super classes (declaration of 'io.realm.MyModelClassRealmProxy' appears in /data/user/0/my.name.space/files/.jrebel/load-dexes/bundle3/classes.zip) at io.realm.MyModuleMediator.copyOrUpdate(MyModuleMediator.java:98) at io.realm.Realm.copyOrUpdate(Realm.java:1164) at io.realm.Realm.copyToRealmOrUpdate(Realm.java:757)

但我的问题与众不同。我在一个库中有一个Realm模块,在我的应用程序中有一个额外的Realm模块。不幸的是,两个模块都包含一个具有相同类名的实体(但在不同的包中)。 领域的代码生成仅创建一个io.realm.<classname>RealmProxy类。因此,我得到了上述异常。

解决方案非常简单:只需重命名实体即可。