Android Room 扩展默认数据库

Bas*_* SG 6 java android annotations android-library android-room

美好的一天堆垛机。

\n\n

假设你必须声明一个带有默认模式的 android 库,其中有 n 个表,如下所示:

\n\n
package com.test.library.db;\n\nimport android.arch.persistence.room.Database;\nimport android.arch.persistence.room.RoomDatabase;\nimport com.test.library.db.entities.defaultTable1;\nimport com.test.library.db.entities.defaultTable2;\nimport com.test.library.db.entities.defaultTableN;\nimport com.test.library.db.dao.DefaultTable1Dao;\nimport com.test.library.db.dao.DefaultTable2Dao;\nimport com.test.library.db.dao.DefaultTableNDao;\n\n@Database(entities = {\n        defaultTable1.class,\n        defaultTable2.class,\n        defaultTableN.class\n}, version = 1)\n\npublic abstract class AppDatabase extends RoomDatabase {\n\n    public abstract DefaultTable1Dao defaultTable1Dao();\n    public abstract DefaultTable2Dao defaultTable2Dao();\n    public abstract DefaultTableNDao defaultTableNDao();\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后您需要将默认架构从 android 库扩展到应用程序,如下所示:

\n\n
package com.test.myapp.db;\n\nimport android.arch.persistence.room.Database;\nimport com.test.myapp.db.entities.Table1;\nimport com.test.myapp.db.entities.Table2;\nimport com.test.myapp.db.entities.TableN;\nimport com.test.myapp.db.dao.Table1Dao;\nimport com.test.myapp.db.dao.Table2Dao;\nimport com.test.myapp.db.dao.TableNDao;\n\n@Database(entities = {\n        Table1.class,\n        Table2.class,\n        TableN.class\n}, version = 1)\n\npublic abstract class AppDatabase extends com.test.library.db.AppDatabase {\n\n    public abstract Table1Dao table1Dao();\n    public abstract Table2Dao table2Dao();\n    public abstract TableNDao tableNDao();\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后创建数据库,我调用:

\n\n
import com.test.library.db.AppDatabase;\n//... Singleton class ...\nappDatabase = Room.databaseBuilder(context,\n                   AppDatabase.class, "test.db")\n                   .build();\n
Run Code Online (Sandbox Code Playgroud)\n\n

问题是 room 似乎无法合并两个注释(显而易见),并且它只需要inside@Database最后一个声明中的表。@Databasecom.test.myapp.db.AppDatabase

\n\n

所以我尝试将@Database使用@Inherit注释的注释继承为类似于此的自定义注释:

\n\n
package com.test.library.db;\n\nimport android.arch.persistence.room.Database;\nimport com.test.library.db.entities.defaultTable1;\nimport com.test.library.db.entities.defaultTable2;\nimport com.test.library.db.entities.defaultTableN;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Inherited;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Inherited\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.CLASS)\n@Database(entities = {\n        defaultTable1.class,\n        defaultTable2.class,\n        defaultTableN.class\n}, version = 1)\npublic @interface CoreDatabase {}\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后用类进行注释@CoreDatabasecom.test.library.db.AppDatabase但房间似乎不允许\xc2\xb4t 允许用@CoreDatabase注释来注释@Database

\n\n

我还知道可以在库中创建默认模式,丢弃com.test.myapp.db.AppDatabase然后使用 SQLite 脚本或迁移创建数据库的其余部分,但这不太可能是理想的,因为它使得维护继承的数据库变得更加困难,并且可能 Room 不允许在没有匹配映射类的情况下创建表,所以...

\n\n

@Database有没有办法像元注释一样包装注释@JacksonAnnotationInside?或其他什么,或者还可以做些什么来实现类似的目标?

\n\n

非常感谢,祝你有美好的一天。

\n