Замените getLoaderManager (). InitLoader на MutableLivedata <Cursor> - PullRequest
2 голосов
/ 04 июня 2019

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 и как получить к нему доступ?

...