Android LoaderManager和CursorLoader混淆

lit*_*leK 3 java android android-cursor android-loadermanager

我试图将我的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);
}

}
Run Code Online (Sandbox Code Playgroud)

Sam*_*zor 7

BASE_URI应该是static Uri在你的定义中ContentProvider,它被用来当你对查询/更新/插入/做任何事情时ContentProvider,UriMatcherContentProvider可以在输出中定义一个Integer允许你使用一个Switch语句(如在例子中)query()该教程中的方法)将正确的查询设置为数据库中的正确表.您应该BASE_URI为数据库中的每个表定义一个不同的.

如果你看一下该教程他们已经定义的单个UriContentProvider:

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

在ContentProvider中,您应该将TUTORIALS_BASE_PATHfrom 的值更改"tutorials"为包含您提到的ADDRESS和DISTANCE列的表的名称.您的CursorLoader构造函数代码如下所示:

return new CursorLoader(getActivity(), YourContentProvider.CONTENT_URI,
            FAVORITES_SUMMARY_PROJECTION, null, null, null);
Run Code Online (Sandbox Code Playgroud)

为了完整性,您应该将变量名称更改为更具描述性,因此,而不是TUTORIALS_BASE_PATHCONTENT_URI,您应该将其更改为类似LOCATIONS_BASE_PATHLOCATIONS_URI.