web-dev-qa-db-fra.com

Comment sélectionner plusieurs bases de données dans Android Room (Comment attacher des bases de données)

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?

8
Siamak Ferdos

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)
4
Ahmad Aghazadeh

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.

1
Yashasvi