Android Room扩展默认数据库

时间:2019-02-13 17:10:07

标签: java android annotations android-room android-library

堆高机。

假设您必须声明一个具有默认架构的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注释的方法?或某些事情,或者可以做些什么来达到类似的目的?

非常感谢,祝您有愉快的一天。

0 个答案:

没有答案