[英]How to load a different database file with Room?
我有一個包含大量數據的應用程序,帶有一個切換按鈕,可以切換整個應用程序的語言(法語或英語)。 但是,我的一些數據存儲在 Room 數據庫中。 我有兩個.db
文件: database_fr.db
和database_en.db
。
假設該應用程序當前使用法語,並加載了database_fr.db
。 按下切換按鈕時,我希望應用程序使用其他.db
文件,以英文顯示所有數據。
我按照這個 Codelab來熟悉 Room,所以這就是我加載數據庫的方式:
@Database(entities = {/* blabla...*/}, version = 1, exportSchema = true)
public abstract class RoomDatabase extends androidx.room.RoomDatabase {
/* the Daos */
private static volatile RoomDatabase INSTANCE;
private static final int NUMBER_OF_THREADS = 4;
static final ExecutorService databaseWriteExecutor =
Executors.newFixedThreadPool(NUMBER_OF_THREADS);
static RoomDatabase getDatabase(final Context context) {
if (INSTANCE == null || currentLocaleIsDifferentFromWantedLocale()) {
synchronized (WordRoomDatabase.class) {
if (INSTANCE == null || currentLocaleIsDifferentFromWantedLocale()) {
// This is where the db files are loaded
if(localeWanted().equals("fr")){
// Load the french database
Log.i("French db file loaded !");
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
RoomDatabase.class, "database")
.createFromAsset("database/database_fr.db")
.build();
}
else if(localeWanted().equals("en")){
// Load the english database
Log.i("English db file loaded !");
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
RoomDatabase.class, "database")
.createFromAsset("database/database_en.db")
.build();
}
}
}
}
return INSTANCE;
}
}
然后在RoomRepository.java
的構造函數中調用此方法getdatabase()
RoomRepository(Application application) {
db = RoomDatabase.getDatabase(application);
/* other variables */
}
最終在我的活動中使用變量訪問它
RoomViewModel roomViewModel = new ViewModelProvider(this).get(RoomViewModel.class);
當按下切換按鈕時,我修改 Locale 並刷新當前 Activity。
strings.xml
文件中存儲的所有文本都以良好的語言顯示,但.db
文件中存儲的所有數據仍以法語(默認語言)顯示。
日志"English db file loaded !"
顯示在我的終端中,所以我知道代碼已執行。
如何更新高效加載的.db
文件? 我覺得我必須卸載/重新安裝應用程序才能使更改生效。
使用 singleton 方法甚至只會構建其中一個數據庫。 一旦檢索到實例, INSTANCE將不再是 null,因此將返回已構建的數據庫。
這是多個數據庫的示例,但用於未知數量(因此主數據庫用於存儲已知/創建的數據庫)。 它確實允許在數據庫之間切換。 因此,您可以調整/簡化它以滿足您的需求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.