Может ли в любое время база данных приложений в Android Room быть нулевой? - PullRequest
0 голосов
/ 05 ноября 2018

При добавлении базы данных комнат предлагается использовать шаблон проектирования Singleton

Примечание. При создании экземпляра объекта AppDatabase следует придерживаться шаблона одноэлементного проектирования, поскольку каждый экземпляр RoomDatabase достаточно дорогой и вам редко требуется доступ к нескольким экземплярам.

Итак, добавление Room Database, следуя примеру Google, написанному на Java, будет выглядеть так:

private var INSTANCE: AppDatabase? = null

fun getInstance(context: Context): AppDatabase? {
    if (INSTANCE == null){
        synchronized(AppDatabase::class){
            INSTANCE = Room.databaseBuilder(context.applicationContext,
                    AppDatabase::class.java, "app_database")
                    .build()
        }
    }
    return INSTANCE
}

Когда я вызываю getInstance, компилятор предполагает, что getInstance может быть null. Поэтому у меня вопрос, есть ли случай, когда getInstance будет null, и нужно ли мне проверять, является ли он null Если нет, то как мне создать экземпляр AppDatabase, чтобы getInstance вернуть AppDatabase, а не AppDatabase?, и это соответствовало рекомендациям по документации?

1 Ответ

0 голосов
/ 19 ноября 2018

Используйте что-то вроде этого, чтобы убедиться, что оно не равно нулю

object DatabaseSource {
    private lateinit var INSTANCE: AppDatabase

    fun getInstance(context: Context): AppDatabase {
        if (!::INSTANCE.isInitialized) {
            synchronized(AppDatabase::class) {
                if (!::INSTANCE.isInitialized) {
                    INSTANCE = Room.databaseBuilder(context.applicationContext,
                                                    AppDatabase::class.java,
                                                    "app_database").build()
                }
            }
        }
        return INSTANCE
    }
}

Позвоните с помощью:

val db = DatabaseSource.getInstance(context)

И это никогда не будет null, поэтому у вас больше нет этой проблемы.

Я добавил двойную блокировку, чтобы повысить безопасность потоков при вызове getInstance().

Но на самом деле вы должны использовать внедрение зависимостей с синглетами, чтобы избежать этого, передаваемого в зависимости от контекста и этого ручного создания / блокировки. Вы должны будете иметь контекст, доступный везде, что является плохим паттерном.

Это также действует как ответ на ваш другой пост , который, по-видимому, является дубликатом этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...