Comme vous le savez, nous pouvons sélectionner plusieurs bases de données en utilisant la commande attach, comme ceci:
String path = DBHelper.getDatabasePath(context);
String sql = "ATTACH DATABASE '" + path + "/" + dbname.toString()
+ ".db' AS \"" + dbname.toString() + "\";";
db.execSQL(sql);
Ensuite, en utilisant le curseur, nous pouvons faire une sélection parmi eux.
En utilisant Android Room, comment puis-je faire cela? Existe-t-il une pièce jointe ou une commande similaire pour le faire?
Peut utiliser ce code pour attacher une autre base de données
@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);
}
}
Dans l'interface Dao, utilisez @SkipQueryVerification
pour ignorer la vérification de requête comme ceci.
@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);
...
}
Utilisation :
LoanDatabase db = LoanDatabase.getInstance(this,"LoanDatabase1")
Book book= db.bookDao().getBookAndLoan(1)
Lors de la construction de la base de données de la pièce à l'aide de DatabaseBuilder class, vous avez la possibilité d'enregistrer un callback qui contient des méthodes qui seraient appelées à chaque ouverture de votre base de données:
/**
* Called when the database has been opened.
*
* @param db The database.
*/
public void onOpen(@NonNull SupportSQLiteDatabase db) {
}
Une option consiste à enregistrer ce rappel et ATTACH
votre autre base de données à l'aide du paramètre db
. Ensuite, dans dao, vous pouvez utiliser des requêtes qui référencent l’autre table.