首页 > 解决方案 > 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 {}

然后用类注释,@CoreDatabasecom.test.library.db.AppDatabase似乎房间不允许@CoreDatabase用注释来@Database注释。

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

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

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

标签: javaandroidannotationsandroid-roomandroid-library

解决方案


推荐阅读