2016-08-15 63 views
4

我按照Realm.io Java文档部分Sharing schemas中所述的建议将我的Android应用程序的模型类包含在realm.io函数中,并将其转移到库中。 当我的应用程序(间接)调用库中的realm.io方法时,我正面临NoSuchMethodError。在库中使用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会导致这种问题吗?

+0

JRebel很容易导致这个问题,但我也会考虑更新到v1.1.1。它不应该有任何重大改变,如果你足够幸运的话,它甚至可以解决这个问题。 – EpicPandaForce

+0

如果禁用JRebel,它会工作吗? –

+0

我也有类似的问题,当我不小心留下Realm的旧编译依赖与新的Realm插件一起。 – EpicPandaForce

回答

3

我想你可能没有正确使用它,我建议你看到一个完整的工作示例,就像他们所参考的那个是Sharing Schemas链接的结尾。链接到这个存储库full working example of realm lib and app。我建议你看看库中的Zoo class,这些方法是唯一暴露给应用程序的东西,你可以看到in the app's activity here(148行和以下)。

我认为这只是你的一部分的混淆,因为从我所了解的你调用你的库类并使用它,就像它是一个Realm实例那样的活动上下文,情况并非如此。希望这可以引导你走上正确的道路!

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

1

这发生在JRebel中,如果问题仍然存在,我建议您尝试使用它的最新版本尝试不使用它。

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类。正因为如此,我得到了上述例外。

解决方法很简单:只需重命名实体即可。

相关问题