Как выполнить операцию CURD или базы данных внутри BroadcastReceiver или вне Activity в шаблоне архитектуры MVVM - PullRequest
0 голосов
/ 07 февраля 2019

Я использую шаблон MVVM в своем приложении и хочу сохранять сообщения в базе данных приложения при получении push-уведомления.

Сохранение данных работает нормально, если я использую AndroidViewModel из Activity.

messageViewModel = ViewModelProviders.of(this).get(MessageViewModel.class);
    messageViewModel.insert(messageReceived);

Здесь messageReceived - это объект ROOM Entity, а messageViewModel - это моя AndroidViewModel

Теперь та же самая функция insert, которую я хочу использовать внутри моего NotificationReceiver.Я попытался инициализировать MessageRepository внутри onReceive и использовал context onReceive (контекстный контекст).

messageRepository = new MessageRepository(context);
messages = messageRepository.getAllMessages();

Это привело меня к ошибке android.content.context не может быть применено к android.app.application

Я также пытался использовать контекст приложения из статического метода, например.App.getContext(), но это не работает.

 class App extends Application{
 public static Application getApplication() {
    return app;
 }
}

, где app - статическая переменная типа Application, это прекрасно работает, когда приложение открыто, но когда приложение закрыто, это не работает.

app = App.this;

Моя AndroidViewModel:

public class MessageViewModel extends AndroidViewModel {

private MessageRepository messageRepository;
private LiveData<List<Message>> messages;

public MessageViewModel(@NonNull Application application) {
    super(application);
    messageRepository = new MessageRepository(application);
    messages = messageRepository.getAllMessages();
}

public void insert(Message message) {
    messageRepository.insert(message);
}

public void update(Message message) {
    messageRepository.update(message);
}

public void delete(Message message) {
    messageRepository.delete(message);
}

public void deleteAll() {
    messageRepository.deleteAll();
}

public LiveData<List<Message>> getAll() {
    return messages;
 }
}

Ваша помощь будет оценена.

...