数据库名字的动态命名
根据前文我们知道数据库的名字在定义的时候是写死的,而有时候我们是需要在不同情况下命名不同的名字的,比如根据不同的用户创建不同的数据库,针对这种情况需要对之前的数据库做下修改,示例如下:
数据库
package com.room.test.db;
import android.content.Context;
import android.text.TextUtils;
import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import com.room.test.dao.TeamUserJoinDao;
import com.room.test.dao.UserDao;
import com.room.test.dao.TeamDao;
import com.room.test.model.UserModel;
import com.room.test.model.TeamModel;
import com.room.test.model.TeamUserJoinModel;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@Database(entities = {
TeamUserJoinModel.class,
UserModel.class,
TeamModel.class},
version = 1, exportSchema = false)
public abstract class UserDatabase extends RoomDatabase {
public abstract TeamDao userDao();
public abstract UserDao cardDao();
public abstract TeamUserJoinDao userCardJoinDao();
public static volatile String USER_ID = "";
private static volatile UserDatabase INSTANCE;
private static final int NUMBER_OF_THREADS = 4;
public static final ExecutorService databaseWriteExecutor =
Executors.newFixedThreadPool(NUMBER_OF_THREADS);
public static UserDatabase createDatabase(final Context context,String userId) {
USER_ID = userId;
return getDatabase(context);
}
public static UserDatabase getDatabase(final Context context) {
if (TextUtils.isEmpty(USER_ID)){
throw new IllegalStateException("使用数据库前必须先调用ApplicationViewModel定义数据库名字");
}
if (INSTANCE == null) {
synchronized (UserDatabase.class) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
UserDatabase.class, "user_database"+USER_ID)//数据库名
.build();
}
}
}
return INSTANCE;
}
}
数据处理中心
package com.room.test.viewmodel;
import android.app.Application;
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import com.room.test.db.UserDatabase;
/**
* 这个类主要是用来做RoomDataBase的整体操作,比如创建、打开、关闭
*/
public class ApplicationViewModel extends AndroidViewModel {
public ApplicationViewModel(@NonNull Application application) {
super(application);
}
public void initRoomDataBase(String dataBaseName){
UserDatabase.createDatabase(getApplication(),dataBaseName);
}
}
关闭数据库
代码如下:
public abstract class UserDatabase extends RoomDatabase {
...
/**
* 关闭数据库
*/
public void closeDataBase(){
if (null != INSTANCE){//尝试打开
// INSTANCE.close();
INSTANCE = null;
USER_ID = "";
databaseWriteExecutor.shutdown();//移除线程池
databaseWriteExecutor =
Executors.newFixedThreadPool(NUMBER_OF_THREADS);
} }
}
数据处理中心
/**
* 这个类主要是用来做RoomDataBase的整体操作,比如创建、打开、关闭
*/
public class ApplicationViewModel extends AndroidViewModel {
...
/**
* 关闭数据库
*/
public void closeRoomDataBase(){
UserDatabase.getDatabase(getApplication()).closeDataBase();
}
...
}
测试代码
public class Test{
//数据库初始化的代码一定要放在所有操作之前,也就是initRoomDataBase函数要在所有之前进行调用
ApplicationViewModel applicationViewModel;
private void init(){
applicationViewModel = new ViewModelProvider(this).get(ApplicationViewModel.class);
applicationViewModel.initRoomDataBase("test");
}
//数据库关闭后,再次使用之前需要再次调用init进行初始化
privoid void close(){
applicationViewModel.closeRoomDataBase();
}
}
本文所使用的演示代码地址:https://github.com/mayangming/RoomTest.git