getLoaderManager устарел с Android 28. ViewModel, Repository и Room заменяют функциональность загрузчика.
Я нашел 2 статьи:
а также
но ни один из них не показывает, как передать курсор моему пользовательскому адаптеру (расширяет 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());
}
}
Мой репозиторий базы данных
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);
}
}
В protected 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 и как получить к нему доступ?
changeCursor()
. В документации говорится: измените базовый курсор на новый курсор. Если есть существующий курсор, он будет закрыт. - developer.android.com/reference/ андроид/виджет/. В этом случае закрытие не требуется, но.. в других случаях Вы должны сделать это самостоятельно. CursorLoaders было легко использовать, потому что они обрабатывали его автоматически. Теперь все в ваших руках. - person deadfish   schedule 04.06.2019LoaderManager.getInstance(this)
вместоgetLoaderManager()
. - person ianhanniballake   schedule 04.06.2019LoaderManager.getInstance()
все еще используется. Я предполагал, что OP нуждается в решении с текущим кодом, где он уже использует возвращаемые значенияMutableLiveData<Cursor>
. - person deadfish   schedule 04.06.2019