getLoaderManager устарел для Android 28. ViewModel, Repository и Room заменяют функциональность загрузчика
Я нашел 2 статьи:
https://medium.com/@JasonCromer/making-room-less-database-queries-using-the-new-android-architecture-components-81180ba6e7e0
и
https://medium.com/androiddevelopers/lifecycle-aware-data-loading-with-android-architecture-components-f95484159de4
, но ни один из них не показывает, как передать курсор на мой пользовательский адаптер (расширяет RecyclerViewCursorAdapter).
Мой плейлистViewModel
public class PlaylistViewModel extends AndroidViewModel {
@NonNull
private MutableLiveData<Cursor> mLiveData = new MutableLiveData<>() ;
@NonNull
private final DatabaseQueryRepository mDatabaseRepository;
private LiveData<Cursor> mResult;
public PlaylistViewModel(Application application) {
super(application);
mDatabaseRepository = DatabaseQueryRepository.newInstance();
loadData();
}
private void loadData() {
mResult= mDatabaseRepository.fetchData(getApplication().
getContentResolver());
}
}
My DatabaseRepository
public class DatabaseQueryRepository {
private static final int TOKEN_QUERY=0;
private QueryHandler mQueryHandler;
private String[] datacolumns;
private String sortorder;
@NonNull
public static DatabaseQueryRepository newInstance(){
return new DatabaseQueryRepository();
}
public MutableLiveData<Cursor> fetchData(ContentResolver contentResolver){
mQueryHandler = new QueryHandler(contentResolver);
datacolumns = new String[]{
MediaStore.Audio.Playlists.DATA,
MediaStore.Audio.Playlists.NAME,
MediaStore.Audio.Playlists._ID};
sortorder = MediaStore.Audio.Playlists.NAME;
Uri uri = MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI;
final String criteria =
MediaStore.Audio.Playlists.NAME
;
final MutableLiveData<Cursor> result = query(TOKEN_QUERY,uri,datacolumns,criteria, null, sortorder );
return result;
}
private MutableLiveData<Cursor> query(int token,
Uri uri,
@Nullable String[] projection,
@Nullable String selection,
@Nullable String[] selectionArgs,
@Nullable String orderby
){
final MutableLiveData<Cursor> result = new MutableLiveData<>();
mQueryHandler.startQuery(token, result, uri,projection,selection, selectionArgs, orderby );
return result;
}
private static class QueryHandler extends AsyncQueryHandler {
public QueryHandler(ContentResolver cr) {
super(cr);
}
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
// super.onQueryComplete(token, cookie, cursor);
MutableLiveData<String> mutabledata = (MutableLiveData<String>) cookie;
try {
switch (token) {
case TOKEN_QUERY:
if (cursor != null && cursor.moveToFirst()) {
String demostring = cursor.getString(0);
int test = cursor.getCount();
String playlist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Playlists.NAME));
long playlist_id = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Playlists._ID));
// ((MutableLiveData<String>) cookie).setValue(demostring);
}
break;
}
} finally {
if (cursor!=null){
// cursor.close();
}
}
}
@Override
public void startQuery(int token, Object cookie, Uri uri, String[] projection, String selection, String[] selectionArgs, String orderBy) {
super.startQuery(token, cookie, uri, projection, selection, selectionArgs, orderBy);
}
}
В защищенном void onQueryComplete курсор возвращает значения. Мне нужен этот курсор, но пример кода закрывает его .????
В своем фрагменте я настроил наблюдателя
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
PlaylistViewModel viewModel =
ViewModelProviders.of(this).get(PlaylistViewModel.class);
viewModel.getData().observe(this, data -> {
});
Вопросы:
Как мне получить курсор. Я знаю из документации, что это должно быть через ViewModel.
- Нужно ли передавать курсор на адаптер или я могу получить доступ к курсору из адаптера
- Я смущен тем, что репозиторий создает курсор, но как насчет mutableLivedata и как получить к нему доступ?