我按照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会引起这种问题吗?
答案 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
类。因此,我得到了上述异常。
解决方案非常简单:只需重命名实体即可。