堆高机。
假设您必须声明一个具有默认架构的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();
问题是,房间似乎无法合并两个@Database
注释(很明显),它仅将表放在{{1}中的最后一个声明@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
,然后使用SQLite脚本或迁移来创建数据库的其余部分,但这不太理想,因为它可以很难维护继承的数据库,并且可能是Room不能在没有匹配的映射类的情况下创建表,所以...
是否有一种像元注释com.test.myapp.db.AppDatabase
一样包装@Database
注释的方法?或某些事情,或者可以做些什么来达到类似的目的?
非常感谢,祝您有愉快的一天。