Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
3 / 2 / 2
Регистрация: 21.03.2017
Сообщений: 297

Room: как правильно инициализировать БД?

11.01.2019, 17:45. Показов 2794. Ответов 0

Студворк — интернет-сервис помощи студентам
Задача: при первом запуске приложения произвести начальную инициализацию БД приложения данными. например, из Json, а затем загрузить меню из той же, уже инициализированной БД. Если же запуск приложения не первый, то нужно загрузить меню из БД.
На время инициализации БД и получения из неё меню нужно отображать экран заставки, который должен заменяться активити с меню после окончания загрузки.

Код Room БД:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
@Database(entities = {Entity1.class, Entity2.class, Entity3.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    private static final String name = "Mine.db";
 
    private static AppDatabase instance;
 
    public abstract Entity1Dao Entity1Dao();
 
    public abstract Entity2Dao Entity2Dao();
 
    public abstract Entity3Dao Entity3Dao();
 
    // load initial data at the first application start
    private void loadInitialData(final Context context, Handler handler) {
        try {
 
            JsonHelper.setRawId(R.raw.init_data);
            JsonHelper.InitData initData = (JsonHelper.getDataFromJson(context));
 
            Entity1Dao().insert(initData.getEntities1());
 
            Entity2Dao().insert(initData.getEntities2());
 
            Entity3Dao().insert(initData.getEntities3());
 
        } catch(Exception ex) {
            Toast.makeText(context, ex.getMessage(), Toast.LENGTH_LONG).show();
        }
    }
 
    public void loadMenu(final Context context, Handler handler) {
        List<Entity1> languages = Entity1Dao().getAllEntities();
        Intent startMainMenuIntent = new Intent(context, MainMenuActivity.class);
        context.startActivity(startMainMenuIntent);
    }
    public static AppDatabase getInstance(final Context context, final Handler handler) {
        if (instance == null) {
            synchronized (AppDatabase.class) {
                instance = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, name)
                        .addCallback(new Callback() {
                            @Override
                            public void onCreate(@NonNull SupportSQLiteDatabase db) {
                                super.onCreate(db);
                                Executors.newSingleThreadScheduledExecutor().execute(new Runnable() {
                                    @Override
                                    public void run() {
                                        getInstance(context, handler).loadInitialData(context, handler);
                                    }
                                });
                            }
                            @Override
                            public void onOpen(@NonNull SupportSQLiteDatabase db) {
                                super.onOpen(db);
                                Executors.newSingleThreadScheduledExecutor().execute(new Runnable() {
                                    @Override
                                    public void run() {
                                        getInstance(context, handler).loadMenu(context, handler);
                                    }
                                });
                            }
                        })
                        .build();
            }
        }
        return instance;
    }
}
Из кода видно, что заведены колбэки на события создания и открытия БД. Проблема в том, что если из активити заставки вызвать метод loadMenu, то при первом запуске приложения вызывается событие onCreate, но сразу вслед за ним вызывается и событие onOpen, обработка которого завершается до того, как проинициализируется БД.

Собственно вопрос: как сделать так, чтобы при первом запуске обработчик onOpen дожидался завершения работы обработчика события onCreate?
Или, может, есть какое-то стандартное решение для такой задачи?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.01.2019, 17:45
Ответы с готовыми решениями:

Как правильно инициализировать и заполнить список
Сам понимаю что где интенсивно уж 3- час торможу. Вопрос по ArrayList Мне надо создать список моих объектов. Создаем объект. ...

Как правильно инициализировать конструктор?
Так? Construct() { a = 0; } или так?

Как правильно инициализировать массив?
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.01.2019, 17:45
Помогаю со студенческими работами здесь

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

Как правильно инициализировать свойства объекта?
Добрый день, товарищи-форумчане! Помогите с VB net. Имеется следующий класс Partial Public Class pledgeNotificationPackageType ...

Как правильно инициализировать сложный объект?
Есть три класса: 1) point -&gt;(double z, double y) 2) frame -&gt;содержит CArray&lt;point*,point*&gt; 3) hull -&gt;содержит...

Структура KeyValuePair, как правильно инициализировать?
Приветствую всех, продолжаю мучить свою задачу, и сейчас прошу у сообщества подсказки, как правильно инициализировать структуру ...

Как правильно инициализировать контекст данных?
Доброго времени суток. Делаю простое приложение, чтобы с COM-порта считывалось входящее число (с эти благо нет проблем). Смотрю разные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru