База данных комнаты не требует новой темы для длинной операции запроса - PullRequest
0 голосов
/ 25 ноября 2018

Везде одна и та же информация, долгое время операции нужно запускать в другом потоке, отличном от потока пользовательского интерфейса, например - работа с базой данных.
... и это правда, если я пытаюсь что-то сохранить в полученную БД:

Невозможно получить доступ к базе данных в главном потоке, так как он может потенциально заблокировать интерфейс на длительный период времени.

Вот мой вопрос, почему я могуполучить все данные из базы данных из пользовательского интерфейса?:)
(в моей базе данных не было .allowMainThreadQueries() "

Это немного измененный код из документации Google:

ViewModel:

public class LocationsViewModel extends AndroidViewModel {

    private LocationRepository locationRepository;
    private LiveData<List<LocationModel>> allLocationsLiveData;

    public LiveData<List<LocationModel>> getAllLocationsLiveData() {
        return allLocationsLiveData;
    }

    public LocationsViewModel(@NonNull Application application) {
        super(application);
        locationRepository = new LocationRepository(application);
        allLocationsLiveData = locationRepository.getAllLocation();
    }
}

Репозиторий:

public class LocationRepository {

    private final LocationDao locationDao;
    private LiveData<List<LocationModel>> allLocation;

    LiveData<List<LocationModel>> getAllLocation() {
        return allLocation;
    }

    LocationRepository(Application application){
        LocationsDatabase db = LocationsDatabase.getDatabase(application);
        locationDao = db.locationDao();
        allLocation = locationDao.getAllLocations();
    }

}

метод инициализации из фрагмента:

private void initData() {
    locationsViewModel = ViewModelProviders.of(this).get(LocationsViewModel.class);
    locationsViewModel.getAllLocationsLiveData().observe(this, new Observer<List<LocationModel>>() {
        @Override
        public void onChanged(@Nullable List<LocationModel> locations) {
            mAdapter.setLocationList(locations);
        }
    });
}

Дао:

@Dao
public interface LocationDao {
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    void insert(LocationModel... locations);

    @Query("SELECT * FROM LocationModel")
    LiveData<List<LocationModel>> getAllLocations();
}

Так почему же я могу получить функцию FromDatabse из пользовательского интерфейса, но мне нужен другой поток для сохранения?

1 Ответ

0 голосов
/ 25 ноября 2018

Вы используете LiveData, которая буквально запускается в фоновом потоке.

Это не происходит синхронно, поэтому это не происходит в основном потоке.

Вы подписаны на изменения, и теизменения рассчитываются в фоновом потоке, а затем передаются только вашей деятельности / фрагменту в главном потоке.

Когда вы пытаетесь что-то сохранить, вы не используете LiveData (чего не следует делать, так что все хорошо), так что он работает в основном потоке.Что не должно.
Так что вам нужно будет запустить его в новом потоке, создать AsyncTask или подобное.

...