Старый конструктор SimpleCursorAdapter устарел.. неужели?

здесь он говорит, что SimpleCursorAdapterконструктор уровня API 1 устарел и использование LoaderManager и CursorLoader рекомендуется.

но углубляясь в LoaderManager и CursorLoaderиспользование я нашел этой пример, где внутри внутреннего класса, который расширяет ListFragment (расширение самого фрагмента, я полагаю) мы создаем CursorLoader. Кажется, все в порядке, за исключением того, что CursorLoader принимает Uri в качестве аргумента. Это означает, что мне нужно создать ContentProvider чтобы получить доступ к моей базе данных.

Я должен признаться, это выглядит как перебор, чтобы пройти через все это, чтобы создать простой ListView С ЭЛЕМЕНТАМИ, поступающими из базы данных. Особенно, если у меня нет намерения сделать данные моей базы данных доступными для других приложений, и основная цель контент-провайдера-сделать это.

так что это действительно стоит того?

особенно в таких случаях, как мой, где контент, который будет извлечен, вероятно, будет быть небольшими. Я серьезно подумываю сделать это по-старому, что скажешь?

5 ответов


Я написал простой CursorLoader для этого не нужен контент-провайдер:

import android.content.Context;
import android.database.Cursor;
import android.support.v4.content.AsyncTaskLoader;

/**
 * Used to write apps that run on platforms prior to Android 3.0. When running
 * on Android 3.0 or above, this implementation is still used; it does not try
 * to switch to the framework's implementation. See the framework SDK
 * documentation for a class overview.
 *
 * This was based on the CursorLoader class
 */
public abstract class SimpleCursorLoader extends AsyncTaskLoader<Cursor> {
    private Cursor mCursor;

    public SimpleCursorLoader(Context context) {
        super(context);
    }

    /* Runs on a worker thread */
    @Override
    public abstract Cursor loadInBackground();

    /* Runs on the UI thread */
    @Override
    public void deliverResult(Cursor cursor) {
        if (isReset()) {
            // An async query came in while the loader is stopped
            if (cursor != null) {
                cursor.close();
            }
            return;
        }
        Cursor oldCursor = mCursor;
        mCursor = cursor;

        if (isStarted()) {
            super.deliverResult(cursor);
        }

        if (oldCursor != null && oldCursor != cursor && !oldCursor.isClosed()) {
            oldCursor.close();
        }
    }

    /**
     * Starts an asynchronous load of the contacts list data. When the result is ready the callbacks
     * will be called on the UI thread. If a previous load has been completed and is still valid
     * the result may be passed to the callbacks immediately.
     * <p/>
     * Must be called from the UI thread
     */
    @Override
    protected void onStartLoading() {
        if (mCursor != null) {
            deliverResult(mCursor);
        }
        if (takeContentChanged() || mCursor == null) {
            forceLoad();
        }
    }

    /**
     * Must be called from the UI thread
     */
    @Override
    protected void onStopLoading() {
        // Attempt to cancel the current load task if possible.
        cancelLoad();
    }

    @Override
    public void onCanceled(Cursor cursor) {
        if (cursor != null && !cursor.isClosed()) {
            cursor.close();
        }
    }

    @Override
    protected void onReset() {
        super.onReset();

        // Ensure the loader is stopped
        onStopLoading();

        if (mCursor != null && !mCursor.isClosed()) {
            mCursor.close();
        }
        mCursor = null;
    }
}

ему нужно только AsyncTaskLoader класса. Либо в Android 3.0 или выше, либо тот, который поставляется с пакетом совместимости.


просто используйте конструктор под ним, тот, который принимает флаги. Не используйте FLAG_AUTO_REQUERY, просто передайте 0 для флагов.

Если вам действительно не нужно обрабатывать изменения данных в базовой БД, пока пользователь смотрит на ListView, вам не нужно беспокоиться о необходимости запроса.

Если, с другой стороны, вы хотите, чтобы ListView отображал изменения в БД, пока пользователь смотрит на список, следуйте советам Google и используйте CursorLoader.

EDIT:

поскольку второй конструктор доступен только в API 11, вы можете просто расширить CursorAdapter самостоятельно. Вам в значительной степени просто нужно реализовать bindView и newView, и все готово.


используйте только устаревший конструктор simpleCursorAdapter. Такая ошибка появилась, когда Я разрабатывал свое приложение, но я использовал его, и он отлично работал с моим приложением. Или попробуйте использовать конструктор ниже устаревший на веб-сайте разработчиков android, который имеет дополнительный аргумент i.e аргумент флага с ним.


Я считаю, что CursorLoader в настоящее время предназначен для использования с ContentProvider.

Если вы хотите загрузить непосредственно из своей базы данных с помощью новой платформы; вы можете рассмотреть возможность расширения AsyncTaskLoader и возврата его из onCreateLoader вместо использования CursorLoader.

Если вы используете существующие методы, вы должны быть более осторожны, сколько времени займет операция запроса. Если ваш запрос займет заметное количество времени, рассмотрите возможность использования AsyncTask для загрузите курсор (и имейте в виду, что запрос выполняется в потоке пользовательского интерфейса).


Я знаю, что этот поток старый, но вы можете просто добавить последний параметр в создание объекта SimpleCursorAdapter. Просто добавить "0".

Это флаг, который нравится Android, и предупреждение уходит.

пример:

SimpleCursorAdapter dataAdapter = new SimpleCursorAdapter(getApplicationContext(), R.layout.item_list_layout, cursor, fromDB(), toLayout(), 0);