Как пропустить context в класс RoomDatabase.Callback в абстрактном классе чтобы оттуда получить доступ к Стрингам?

Подскажите почему я не могу вызвать в RoomDatabase.Callback классе Database стринговое значение из Resources?? Как я понимаю нужен context, но я не пойму как его запихнуть в КолБэк.

Подскажите пожалуйста

@Database(entities = {Word.class}, version = 1, exportSchema = false)
public abstract class WordDatabase extends RoomDatabase {

    public abstract WordDao dao();

    private static volatile WordDatabase INSTANCE;
    public static final int NUMBER_OF_THREADS = 4;
    static final ExecutorService databaseWriteExecutor = Executors.newFixedThreadPool(NUMBER_OF_THREADS);

    static WordDatabase getDatabase(final Context context) {
        if (INSTANCE == null) {
            synchronized (WordDatabase.class) {
                if (INSTANCE == null) {
                    INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                            WordDatabase.class, "word_database")
                            .addCallback(sRoomDatabaseCallback)
                            .build();
                }
            }
        }
        return INSTANCE;
    }



    private static RoomDatabase.Callback sRoomDatabaseCallback = new RoomDatabase.Callback() {
        @Override
        public void onCreate(@NonNull SupportSQLiteDatabase db) {
            databaseWriteExecutor.execute(() -> {
                WordDao dao = INSTANCE.dao();
                dao.deleteAll();

                Word word;

                word = new Word(getResources.getString(R.string.app_name), "perevod slova", 1); dao.insert(word); // HERE the "getResources" command is unavailable.
                });
            }
        };
    }

Ответы (1 шт):

Автор решения: ЮрийСПб

Вам надо как-то контекст передать в анонимный класс, реализующий колбэк. Это можно сделать через добавление метода-сеттера (и вызова оного после создания экземпляра класса) или надо явно объявить класс, реализующий колбэк, чтобы иметь возможность объявить конструктор, через который вы сможете передать констекст. Вот так примерно:

private class MyCallback extends RoomDatabase.Callback {

    private @NonNull Context context;

    public void MyCallback(@NonNull Context context) { this.context = context; }

    @Override
    public void onCreate(@NonNull SupportSQLiteDatabase db) {
        databaseWriteExecutor.execute(() -> {
            WordDao dao = INSTANCE.dao();
            dao.deleteAll();

            Word word;

            word = new Word(context.getString(R.string.app_name), "perevod slova", 1); dao.insert(word);
            });
        }
    };
}

Соответственно надо будет использовать уже этот класс, вместо вашей переменной, проинициализированной анонимным классом:

INSTANCE = Room.databaseBuilder(context, WordDatabase.class, "word_database")
        .addCallback(new MyCallback(context))
        .build();
→ Ссылка