如何使用 Room 加载不同的数据库文件?

How to load a different database file with Room?

目标

我有一个包含大量数据的应用程序,带有一个切换按钮,可以切换整个应用程序的语言(法语或英语)。但是,我的一些数据存储在 Room 数据库中。我有两个 .db 文件:database_fr.dbdatabase_en.db.

假设该应用当前使用法语,并加载了 database_fr.db。按下切换按钮时,我希望应用程序使用其他 .db 文件,以英文显示所有数据。

我试过的

我跟着 this 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文件?我觉得我必须卸载/重新安装应用程序才能使更改生效。

使用单例方法甚至只会构建一个数据库。检索实例后,INSTANCE 将不再为空,return 已构建的数据库也将不再为空。

这是多个数据库的示例,但用于未知数量(因此主数据库用于存储 known/created 数据库)。它确实允许在数据库之间切换。因此,您或许可以 adapt/simplify 满足您的需求。