如何使用 Room 加载不同的数据库文件?
How to load a different database file with Room?
目标
我有一个包含大量数据的应用程序,带有一个切换按钮,可以切换整个应用程序的语言(法语或英语)。但是,我的一些数据存储在 Room 数据库中。我有两个 .db
文件:database_fr.db
和 database_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 满足您的需求。
目标
我有一个包含大量数据的应用程序,带有一个切换按钮,可以切换整个应用程序的语言(法语或英语)。但是,我的一些数据存储在 Room 数据库中。我有两个 .db
文件:database_fr.db
和 database_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 满足您的需求。