Создание экземпляра Room Database внутри обратного вызова или использование переменной member этой базы данных - PullRequest
0 голосов
/ 02 февраля 2019

В чем разница между созданием объекта RoomDatabase для использования внутри обратного вызова, как в этом примере BasicSample в строке 83 и 88,

И,

Использование переменной-члена RoomDatabase внутри обратного вызова, как в этом примере android-room-with-a-view в строке 71?

Я не спрашиваю мнения, Я спрашиваю, есть ли разница или преимущества между этими двумя примерами?

Я не знаю, почему нет ответа

1 Ответ

0 голосов
/ 04 февраля 2019

IN SHORT

Короче говоря, оба кода практически одинаковы.Они проверяют значение переменной-члена.Если значение уже существует, просто верните это значение, не создавая новый объект.Иначе, если значение переменной равно нулю, в этом случае создайте новый объект, назначьте объект переменной-члену и затем верните значение.

IN LONG

Оба кода, которые вы упомянули, предназначены только для реализации Singleton Pattern .Для этого есть несколько способов:

хранилище android-архитектура-компонентов

AppDatabase database = AppDatabase.getInstance(appContext, executors);

В приведенном выше коде мы вызываем метод getInstance(.. , ..), которыйреализует шаблон синглтона следующими способами:

public static AppDatabase getInstance(final Context context, final AppExecutors executors) {
if (sInstance == null) {
    synchronized (AppDatabase.class) {
        if (sInstance == null) {
            sInstance = buildDatabase(context.getApplicationContext(), executors);
            sInstance.updateDatabaseCreated(context.getApplicationContext());
        }
    }
}
   return sInstance;
}

Метод getInstance() не всегда создает новый объект .Вместо этого он проверяет значение переменной-члена sInstance.Если значение равно null, присвойте ему значение объекта БД, а затем верните значение.А в случае, если значение не равно нулю, просто верните уже сохраненное значение, т.е. значение предыдущего объекта БД.

android-room-with-a-view репозиторий

Он также делает то же самое, то есть использует одно и то же значение синглтона INSTANCE и передает его новому объекту AsyncTask .

new PopulateDbAsync(INSTANCE).execute();

Одиночный узор

static WordRoomDatabase getDatabase(final Context context) {
    if (INSTANCE == null) {
        synchronized (WordRoomDatabase.class) {
            if (INSTANCE == null) {
                INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                        WordRoomDatabase.class, "word_database")
                        // Wipes and rebuilds instead of migrating if no Migration object.
                        // Migration is not part of this codelab.
                        .fallbackToDestructiveMigration()
                        .addCallback(sRoomDatabaseCallback)
                        .build();
            }
        }
    }
    return INSTANCE;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...