java - Android Room 扩展默认数据库
问题描述
美好的一天堆垛机。
假设您必须声明一个具有默认模式的 android 库,其中包含 n 个表,如下所示:
package com.test.library.db;
import android.arch.persistence.room.Database;
import android.arch.persistence.room.RoomDatabase;
import com.test.library.db.entities.defaultTable1;
import com.test.library.db.entities.defaultTable2;
import com.test.library.db.entities.defaultTableN;
import com.test.library.db.dao.DefaultTable1Dao;
import com.test.library.db.dao.DefaultTable2Dao;
import com.test.library.db.dao.DefaultTableNDao;
@Database(entities = {
defaultTable1.class,
defaultTable2.class,
defaultTableN.class
}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract DefaultTable1Dao defaultTable1Dao();
public abstract DefaultTable2Dao defaultTable2Dao();
public abstract DefaultTableNDao defaultTableNDao();
}
然后,您需要将默认模式从 android 库扩展到应用程序,如下所示:
package com.test.myapp.db;
import android.arch.persistence.room.Database;
import com.test.myapp.db.entities.Table1;
import com.test.myapp.db.entities.Table2;
import com.test.myapp.db.entities.TableN;
import com.test.myapp.db.dao.Table1Dao;
import com.test.myapp.db.dao.Table2Dao;
import com.test.myapp.db.dao.TableNDao;
@Database(entities = {
Table1.class,
Table2.class,
TableN.class
}, version = 1)
public abstract class AppDatabase extends com.test.library.db.AppDatabase {
public abstract Table1Dao table1Dao();
public abstract Table2Dao table2Dao();
public abstract TableNDao tableNDao();
}
然后创建我调用的数据库:
import com.test.library.db.AppDatabase;
//... Singleton class ...
appDatabase = Room.databaseBuilder(context,
AppDatabase.class, "test.db")
.build();
问题是 room 似乎无法合并两个@Database
注释(很明显),它只需要 inside 最后一个声明中的@Database
表格com.test.myapp.db.AppDatabase
。
因此,我尝试@Database
使用@Inherit
注释将注释继承到与此类似的自定义注释中:
package com.test.library.db;
import android.arch.persistence.room.Database;
import com.test.library.db.entities.defaultTable1;
import com.test.library.db.entities.defaultTable2;
import com.test.library.db.entities.defaultTableN;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
@Database(entities = {
defaultTable1.class,
defaultTable2.class,
defaultTableN.class
}, version = 1)
public @interface CoreDatabase {}
然后用类注释,@CoreDatabase
但com.test.library.db.AppDatabase
似乎房间不允许@CoreDatabase
用注释来@Database
注释。
我也知道可以在库中创建默认模式,丢弃com.test.myapp.db.AppDatabase
然后使用 SQLite 脚本或迁移创建数据库的其余部分,但这不太可能是理想的,因为它更难维护继承的数据库,并且可能是 Room 不允许在没有匹配映射类的情况下创建表,所以......
有没有办法@Database
像元注释一样包装注释@JacksonAnnotationInside
?或者什么,或者还有什么可以做的来实现类似的东西?
非常感谢,祝您有美好的一天。
解决方案
推荐阅读
- c - 生成没有参数的主要参数
- c++ - OpenClipboard 因 CLIPBRD_E_CANT_OPEN 崩溃
- css - 在 2 个子根之间应用不同的 css 文件
- windows - 如何从 Qt 中的对话框启动主窗口
- r - 为什么包 stats 中的 scatter.smooth 和包 ggplot2 中的 geom_smooth 会给出不同的结果?
- firebase - Firebase 推送通知权限
- python - SpaCy - 将神经核函数结果拆分成句子
- excel - 无法在 SharePoint 上使用 VBScript 更新 excel 文件
- api - Qliksense 中 JIRA Rest API 的增量负载
- flutter - 如何使用flutter_bloc在不改变Flutter状态的情况下将一个页面导航到另一个页面