Android JetPack之ROOM(五)

数据库名字的动态命名

根据前文我们知道数据库的名字在定义的时候是写死的,而有时候我们是需要在不同情况下命名不同的名字的,比如根据不同的用户创建不同的数据库,针对这种情况需要对之前的数据库做下修改,示例如下:

数据库

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章