java - 如何从 Android Room 中的多个数据库中进行选择(如何附加数据库)
问题描述
如您所知,我们可以使用如下的附加命令从多个数据库中进行选择:
String path = DBHelper.getDatabasePath(context);
String sql = "ATTACH DATABASE '" + path + "/" + dbname.toString()
+ ".db' AS \"" + dbname.toString() + "\";";
db.execSQL(sql);
然后通过使用光标,我们可以从它们中进行选择。
通过使用 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 接口中使用@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)
推荐阅读
- python - 使用 python 应用过滤器从特定国家/地区提取有关某些主题标签的推文
- python - Elastic Beanstalk - ImportError:无法导入名称“Celery”
- python-3.x - 在 python 中使用我的 gmail 帐户发送电子邮件?
- flutter - Dart 包 - 如何隐藏内部方法和类?
- haskell - 展开存在量化的 GADT
- r - 在R中按组创建基于稀疏变量的日期范围
- python - 在 pandas 列中查找最接近的值
- python - Pandas - 如果不存在分隔符,则使用默认值拆分列
- cadence-workflow - 如何取消从工作流异步调用的活动?
- javascript - 在javascript中合并两个数组和单独的数组