Android NullPointerException для объекта RoomDatabase после закрытия приложения - PullRequest
1 голос
/ 18 марта 2020

Когда я пытаюсь получить доступ к объекту RoomDatabase внутри моего одноэлементного класса RepositoryProvider, я получаю исключение NullPointerException после закрытия моего приложения. Вы знаете, что является причиной этого странного поведения? База данных приложений инициализируется в SplashActivity. До сих пор я пытался заменить мой «синхронизированный синглтон» на «enum singleton», а также добавить префикс stati c к объекту базы данных, но ничего не получается.

public class RepositoryProvider {
    private static RepositoryProvider INSTANCE;
    private TrainingSummaryRepository trainingSummaryRepository;
    private UserRepository userRepository;
    private BluetoothDeviceRepository bluetoothDeviceRepository;
    private TrainingActivityRepository trainingActivityRepository;
    private AppDatabase appDatabase;
    private ExternalStorageDatabase externalStorageDatabase;
    private TrainingRepository trainingRepository;
    private FriendRepository friendRepository;

    public static RepositoryProvider getInstance() {
        if (INSTANCE == null) {
            synchronized (RepositoryProvider.class) {
                if (INSTANCE == null) {
                    INSTANCE = new RepositoryProvider();
                }
            }
        }
        return INSTANCE;
    }

    public void initDatabase(Context context) {
        appDatabase = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, "nutpro-db")
                .addMigrations(MIGRATION_1_2)
                .build();
        userRepository = new UserRepository(appDatabase);
    }

    public void initExternalStorageDatabase(Context context, String appFileSystemName) {
        externalStorageDatabase = new ExternalStorageDatabase(context, appFileSystemName);
    }


    public TrainingRepository getTrainingRepository() {
        if (trainingRepository == null) {
            trainingRepository = new TrainingRepository();
        }
        return trainingRepository;
    }

    public FriendRepository getFriendRepository() {
        if (friendRepository == null) {
            friendRepository = new FriendRepository(appDatabase.friendDao(), getUserRepositoryInstance());
        }
        return friendRepository;
    }

    public ExternalStorageDatabase getExternalStorageDatabase() {
        return externalStorageDatabase;
    }

    public TrainingSummaryRepository getTrainingSummaryRepositoryInstance() {
        if (trainingSummaryRepository == null) {
            trainingSummaryRepository = new TrainingSummaryRepository(appDatabase);
        }
        return trainingSummaryRepository;
    }

    public UserRepository getUserRepositoryInstance() {
        return userRepository;
    }

    public BluetoothDeviceRepository getBluetoothDeviceRepositoryInstance() {
        if (bluetoothDeviceRepository == null) {
            bluetoothDeviceRepository = new BluetoothDeviceRepository(appDatabase);
        }
        return bluetoothDeviceRepository;
    }

    public TrainingActivityRepository getTrainingActivityRepository() {
        if (trainingActivityRepository == null) {
            trainingActivityRepository = new TrainingActivityRepository(appDatabase);
        }
        return trainingActivityRepository;
    }

    public void clear() {
        if (appDatabase != null) {
            appDatabase.clearAllTables();
        }
    }
}
...