当我将Room持久性库添加到我的库中时,无法从.aar文件加载类

问题描述 投票:0回答:1

我目前正在开发一个报警库,需要在sqlite数据库中存储多个报警详细信息。所以我使用google的Room persistence库和我的报警库。

我在build.gradle中添加了以下代码。

implementation 'android.arch.persistence.room:runtime:1.1.1'
annotationProcessor 'android.arch.persistence.room:compiler:1.1.1'

我添加了数据库类

@Database(entities = AlarmDetails.class, version = 1)
public abstract class AlarmDatabase extends RoomDatabase {

  public abstract AlarmDao alarmDao();
}

我还添加了数据访问对象

@Dao
public interface AlarmDao {

  @Insert(onConflict = OnConflictStrategy.REPLACE)
  void insert(AlarmDetails alarmDetails);

  @Update
  void update(AlarmDetails alarmDetails);

  @Delete
  void delete(AlarmDetails alarmDetails);

  @Query("SELECT * FROM alarms")
  List<AlarmDetails> getAll();
}

我正在我的库的主类中创建一个数据库实例,如下所示

/*Constructor*/
public AlarmBase(Context mcontext,Context ncontext) {
    this.mContext = mcontext;

    alarmDatabase= Room.databaseBuilder(ncontext,
            AlarmDatabase.class, "alarm_db")
            .build();
}

我从我的演示项目调用上面的构造函数并传递应用程序上下文,如下所示

Context applicationContext=MyApplicationClass.getContext();
    alarmBase = new AlarmBase(this,applicationContext);

这是我的应用程序类

public class MyApplicationClass extends MultiDexApplication {
  private static MultiDexApplication instance;

  @Override
  public void onCreate() {
    super.onCreate();
    instance = this;
  }

  public static Context getContext() {
    return instance.getApplicationContext();
  }
}

但是当我运行项目时,我得到以下错误

    --------- beginning of crash
02-21 20:23:34.643 11930-11930/com.mid.alarmdemo E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.mid.alarmdemo, PID: 11930
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/mid/alarmlib/roomsqlite/AlarmDatabase;
    at com.mid.alarmlib.AlarmBase.<init>(AlarmBase.java:39)
    at com.mid.alarmdemo.MainActivity.onCreate(MainActivity.java:54)
    at android.app.Activity.performCreate(Activity.java:6362)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2441)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2548)
    at android.app.ActivityThread.access$1100(ActivityThread.java:154)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1399)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:157)
    at android.app.ActivityThread.main(ActivityThread.java:5613)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:774)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)
 Caused by: java.lang.ClassNotFoundException: Didn't find class "com.mid.alarmlib.roomsqlite.AlarmDatabase" on path: DexPathList[[zip file "/data/app/com.mid.alarmdemo-1/base.apk"],nativeLibraryDirectories=[/data/app/com.mid.alarmdemo-1/lib/arm64, /vendor/lib64, /system/lib64]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
    at com.mid.alarmlib.AlarmBase.<init>(AlarmBase.java:39) 
    at com.mid.alarmdemo.MainActivity.onCreate(MainActivity.java:54) 
    at android.app.Activity.performCreate(Activity.java:6362) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2441) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2548) 
    at android.app.ActivityThread.access$1100(ActivityThread.java:154) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1399) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:157) 
    at android.app.ActivityThread.main(ActivityThread.java:5613) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:774) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652) 
    Suppressed: java.lang.NoClassDefFoundError: com.mid.alarmlib.roomsqlite.AlarmDatabase
    at dalvik.system.DexFile.defineClassNative(Native Method)
    at dalvik.system.DexFile.defineClass(DexFile.java:226)
    at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:219)
    at dalvik.system.DexPathList.findClass(DexPathList.java:338)
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:54)
            ... 16 more
    Suppressed: java.lang.ClassNotFoundException: com.mid.alarmlib.roomsqlite.AlarmDatabase
    at java.lang.Class.classForName(Native Method)
    at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
    at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
            ... 15 more
 Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available

我能够和我的库一起运行项目,直到我将Room persistence添加到我的库中

android sqlite android-sqlite android-library android-multidex
1个回答
0
投票

我刚刚将以下行添加到项目的build.gradle(模块应用程序)中,

implementation 'android.arch.persistence.room:runtime:1.1.1'
annotationProcessor 'android.arch.persistence.room:compiler:1.1.1'

它工作得很好

© www.soinside.com 2019 - 2024. All rights reserved.