3

我正在尝试将我的 Android 应用程序转换为使用 LoaderManager 和 CursorLoader。基本上,我有一个包含 ADDRESS 列和 DISTANCE 列的 SQLite 数据库,我想将列值加载到我的 ListView 行中。

现在,我做了很多研究,一切都指向本教程:http: //mobile.tutsplus.com/tutorials/android/android-sdk_content-providers/

这是一个很好的教程,但有几件事我仍然不明白。主要是,如何构造传递给“new CursorLoader()”的内容 URI?我没有使用来自设备联系人等的任何外部数据。

请在下面查看我的代码。我对如何生成 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);
}

}
4

1 回答 1

7

BASE_URI应该是在您的中static Uri定义的,ContentProvider它用于当您对该教程中的方法)来设置对数据库中正确表的正确查询。您应该为数据库中的每个表定义一个不同的。ContentProviderUriMatcherContentProviderIntegerSwitchquery()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_PATHfrom的值更改"tutorials"为包含您提到的 ADDRESS 和 DISTANCE 列的表名。您的CursorLoader构造函数代码如下所示:

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

为了完整起见,您应该将变量名称更改为更具描述性,因此您应该将其更改为类似于 and 的东西,而不是TUTORIALS_BASE_PATHand 。CONTENT_URILOCATIONS_BASE_PATHLOCATIONS_URI

于 2012-02-20T04:52:50.433 回答