Как пропустить 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();