簡體   English   中英

如何使用 Room 加載不同的數據庫文件?

[英]How to load a different database file with Room?

目標

我有一個包含大量數據的應用程序,帶有一個切換按鈕,可以切換整個應用程序的語言(法語或英語)。 但是,我的一些數據存儲在 Room 數據庫中。 我有兩個.db文件: database_fr.dbdatabase_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,因此將返回已構建的數據庫。

這是多個數據庫的示例,但用於未知數量(因此主數據庫用於存儲已知/創建的數據庫)。 它確實允許在數據庫之間切換。 因此,您可以調整/簡化它以滿足您的需求。

Android Room 可以管理多個數據庫並從模板數據庫創建數據庫嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM