加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – Android LoaderManager和CursorLoader混淆

发布时间:2020-12-15 08:47:45 所属栏目:Java 来源:网络整理
导读:我试图将我的 Android应用程序转换为使用LoaderManager和CursorLoader.基本上,我有一个包含ADDRESS列和DISTANCE列的SQLite数据库,我想将列值加载到ListView行中. 现在,我做了很多研究,所有内容都指向本教程:http://mobile.tutsplus.com/tutorials/android/a
我试图将我的 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,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);
}

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

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

}

解决方法

BASE_URI应该是在ContentProvider中定义的静态Uri,它用于当您对ContentProvider进行查询/更新/插入/任何操作时,也会在ContentProvider中定义的UriMatcher可以输出允许您使用Switch的Integer语句(在该教程中的query()方法的示例中)将正确的查询设置为数据库中的正确表.您应该为数据库中的每个表定义不同的BASE_URI.

如果您查看该教程,他们已在ContentProvider中定义了一个Uri:

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,null);

为了完整起见,您应该将变量名称更改为更具描述性,因此您应该将其更改为类似于LOCATIONS_BASE_PATH和LOCATIONS_URI的TUTORIALS_BASE_PATH和CONTENT_URI.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读