房间数据库不需要新的线程来进行长时间的查询操作

Room database not require new Thread for long query operation

到处都是相同的信息,长时间操作需要在其他线程中运行,不同于UI线程,例如-数据库操作。
...这是真的,如果我尝试将某些内容保存到数据库中,我会得到:

Cannot access database on the main thread since it may potentially lock the UI for a long period of time.

这是我的问题,为什么我能够从 UI 的数据库中获取所有数据? :)
(我的数据库没有 .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();
}

那么,为什么我能够从 UI 获取 FromDatabse,但需要其他线程进行保存?

您使用 LiveData,它在后台线程上 运行s。

它不是同步发生的,所以它不会发生在主线程上。

您订阅更改,这些更改是在后台线程上计算的,然后仅在主线程上提供给您的 Activity/Fragment。

当您尝试保存某些内容时,您不会使用 LiveData(您也不应该使用它,所以一切都很好),因此它 运行s 在主线程上。这是不应该的。
因此,您需要 运行 在新线程中创建一个 AsyncTask 或类似的。