java - 如何从Android Room中的多个数据库中进行选择(How to attach databases)

标签 java android sqlite android-room android-architecture-components

如您所知,我们可以使用如下附加命令从多个数据库中进行选择:

String path = DBHelper.getDatabasePath(context);
String sql = "ATTACH DATABASE '" + path + "/" + dbname.toString()
                + ".db' AS \"" + dbname.toString() + "\";";
db.execSQL(sql);

然后通过使用 Cursor,我们可以从中进行选择。

通过使用 Android Room,我该怎么做?是否有任何附件或类似命令可以执行此操作?

最佳答案

可以使用此代码附加另一个数据库

@Database(entities = {Book.class, User.class}, version = 1)
public abstract class LoanDatabase extends RoomDatabase {

    public abstract UserDao userDao();

    public abstract BookDao bookDao();

    private static LoanDatabase INSTANCE;

    public static LoanDatabase getInstance(Context context,final String attachDatabaseName) {
        if (INSTANCE == null) {{
            INSTANCE = Room.databaseBuilder(context,
                    LoanDatabase.class, "LoanDatabase").addCallback(new Callback() {
                @Override
                public void onOpen(@NonNull SupportSQLiteDatabase db) {
                    attach(attachDatabaseName,"/data/data/com.test.roomwithdagger/databases/");
                    super.onOpen(db);
                }
            })
                    .build();
        }}
        return INSTANCE;
    }

    private static void attach(final String databaseName, final String databasePath) {
        String sql = "ATTACH DATABASE '" + databasePath + databaseName
                + "' AS \"" + databaseName + "\";";
        INSTANCE. mDatabase.execSQL(sql);
    }
}

public void attachDatabase(String databaseName,String databasePath){

    String sql = "ATTACH DATABASE '" + databasePath + "/" + databaseName
            + ".db' AS \"" + databaseName + "\";";
    INSTANCE.mDatabase.execSQL(sql);
}
}

在 Dao 接口(interface)中使用 @SkipQueryVerification 来跳过这样的查询验证。

@Dao
public interface BookDao {

...

    @SkipQueryVerification
    @Query("SELECT * FROM main.Book b INNER JOIN LoanDatabase1.Loan l on b.Id=l.BookId where b.Id=:bookId")
    Book getBookAndLoan(int bookId);
...

}

使用:

LoanDatabase db = LoanDatabase.getInstance(this,"LoanDatabase1")

Book book= db.bookDao().getBookAndLoan(1)

关于java - 如何从Android Room中的多个数据库中进行选择(How to attach databases),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50015622/

相关文章:

java - 获取 Java 目录中最近 7 天内修改的所有文件

java - MyBatis - 如何从 swing 应用程序设置数据库属性?

android - Activity.finishAffinity() 与 Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK

java - Android:从 "Downloads"文件夹中删除下载的文件快捷方式

database - Sqlite 计算查询中 YYYYMMDD 日期格式之间的天数差异

sqlite - 在 SQLite(或 Postgres)中,你能拥有一个行元素数量可变的表吗?

php - 如何从打开的连接确定 SQLite 文件名?

java - 根据用户输入更新网页

java - 日期的 Hamcrest 库

android - 来自 ONE ActionTab 的多个 fragment