Android LoaderManager и CursorLoader Путаница - PullRequest
3 голосов
/ 20 февраля 2012

Я пытаюсь конвертировать приложение для Android, чтобы использовать LoaderManager и CursorLoader.По сути, у меня есть база данных SQLite, содержащая столбец ADDRESS и столбец DISTANCE, и я хочу загрузить значения столбца в мои строки ListView.

Теперь я провел много исследований, и все указывает на этоучебник: http://mobile.tutsplus.com/tutorials/android/android-sdk_content-providers/

Это хороший учебник, но есть пара вещей, которые я до сих пор не понимаю.Главным образом, как мне сконструировать URI контента, который передается в 'new CursorLoader ()'?Я не использую какие-либо внешние данные, такие как контакты устройства и т. Д.

Пожалуйста, смотрите мой код ниже.Я не понимаю, как создать значение для BASE_URI:

public class FavoritesFragment extends ListFragment implements
    LoaderManager.LoaderCallbacks<Cursor> {

SimpleCursorAdapter mAdapter;

static final String[] FAVORITES_SUMMARY_PROJECTION = new String[] {
        MyApplication.COLUMN_ID, MyApplication.COLUMN_ADDRESS,
        MyApplication.COLUMN_DISTANCE, };

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mAdapter = new SimpleCursorAdapter(getActivity(),
            R.layout.locations_list_row, null, new String[] {
                    MyApplication.COLUMN_ADDRESS,
                    MyApplication.COLUMN_DISTANCE }, new int[] {
                    R.id.address2, R.id.distance }, 0);
    setListAdapter(mAdapter);

    getLoaderManager().initLoader(0, null, this);
}

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    // Insert desired behavior here.
}

public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    return new CursorLoader(getActivity(), ***BASE_URI***,
            FAVORITES_SUMMARY_PROJECTION, null, null, null);
}

public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    mAdapter.swapCursor(data);
}

public void onLoaderReset(Loader<Cursor> loader) {
    mAdapter.swapCursor(null);
}

}

1 Ответ

7 голосов
/ 20 февраля 2012

BASE_URI должен быть static Uri, определенным в вашем ContentProvider, он используется для того, чтобы при выполнении запроса / обновления / вставки / чего-либо к ContentProvider, UriMatcher, который также определен в ContentProvider может выводить Integer, позволяя вам использовать оператор Switch (как в примере метода query() в этом учебном пособии), чтобы установить правильный запрос к правильной таблице в вашей базе данных. Вы должны определить разные BASE_URI для каждой таблицы в вашей базе данных.

Если вы посмотрите на этот учебник, они определили один Uri в ContentProvider:

private static final String TUTORIALS_BASE_PATH = "tutorials";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY
        + "/" + TUTORIALS_BASE_PATH);

В вашем ContentProvider вы должны изменить значение TUTORIALS_BASE_PATH с "tutorials" на любое имя вашей таблицы, которое содержит столбцы ADDRESS и DISTANCE, которые вы упомянули. Ваш код конструктора CursorLoader будет выглядеть так:

return new CursorLoader(getActivity(), YourContentProvider.CONTENT_URI,
            FAVORITES_SUMMARY_PROJECTION, null, null, null);

Для полноты вы должны изменить имена переменных, чтобы они были более описательными, поэтому вместо TUTORIALS_BASE_PATH и CONTENT_URI вы должны изменить их на что-то вроде LOCATIONS_BASE_PATH и LOCATIONS_URI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...