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

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