[英]NoSuchMethodError when using realm.io in a library
我按照realm.io Java文檔部分共享模式中描述的建議,將我的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
我使用此代碼段作為模板
-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造成這種問題嗎?
我認為你可能沒有正確使用它,我建議你看到一個完整的工作示例,就像他們引用的那個是共享模式鏈接的結尾。 鏈接是這個存儲庫的完整工作示例的領域和應用程序 。 我建議您從庫中查看Zoo類 ,這些方法是暴露給應用程序的唯一方法,您可以在此處的應用程序活動中看到 (第148行和向下)。
我認為這只是你的一個混亂,因為根據我的理解你正在調用你的庫類並使用它就像它是一個Realm實例的那個活動上下文而不是這種情況。 希望這能引導你走上正確的道路!
基本上,您只需根據配置創建實例,這樣就不需要在那里傳遞上下文。
這種情況發生在JRebel上,如果問題仍然存在,我建議您嘗試使用它的最新版本嘗試不使用它。
我收到了與原始帖子相同的錯誤消息。
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
類。 因此,我得到了上述異常。
解決方案非常簡單:只需重命名實體即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.