簡體   English   中英

在庫中使用realm.io時出現NoSuchMethodError

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM