Как выбрать из нескольких баз данных в Android Room (Как прикрепить базы данных) - PullRequest
0 голосов
/ 25 апреля 2018

Как вы знаете, мы можем выбирать из нескольких баз данных, используя команду присоединения, например так:

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

Затем, используя Cursor, мы можем выбирать из них.

С помощью Android Room, как я могу это сделать?Есть ли вложения или аналогичные команды для этого?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Можно использовать этот код для подключения другой базы данных

@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)
0 голосов
/ 25 апреля 2018

При создании базы данных комнаты с использованием класса DatabaseBuilder у вас есть возможность зарегистрировать обратный вызов , который имеет методы, которые будут вызываться при каждом открытии вашей базы данных:

 /**
         * Called when the database has been opened.
         *
         * @param db The database.
         */
        public void onOpen(@NonNull SupportSQLiteDatabase db) {
        }

Один из вариантов - зарегистрировать этот обратный вызов и ATTACH другую базу данных, используя параметр db. Тогда в dao у вас могут быть запросы, которые ссылаются на другую таблицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...