java – Android LoaderManager和CursorLoader混淆
我试图将我的
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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |