數據庫名字的動態命名
根據前文我們知道數據庫的名字在定義的時候是寫死的,而有時候我們是需要在不同情況下命名不同的名字的,比如根據不同的用戶創建不同的數據庫,針對這種情況需要對之前的數據庫做下修改,示例如下:
數據庫
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 = "";
}
}
...
}
數據處理中心
/**
* 這個類主要是用來做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