2012-02-20 46 views
3

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

,我已经做了很多的研究,一切都指向这个教程: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); 
} 

} 
+0

[**了解'LoaderManager'(第2部分)**](http://www.androiddesignpatterns.com/2012/07/understanding-loadermanager.html)是一个很好的学习文章。 – 2012-09-01 19:54:28

回答

7

BASE_URI应该在你的ContentProvider定义的static Uri,它的用意是,当你犯了一个查询/更新/插入/不管到ContentProvider,一个UriMatcher这也是在ContentProvider可以输出Integer让您在您的数据库使用Switch语句(如在该教程的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, 
      FAVORITES_SUMMARY_PROJECTION, null, null, null); 

为了完整起见,你应该改变变量名称更具描述性,所以不是TUTORIALS_BASE_PATHCONTENT_URI,你应该把它更改为类似LOCATIONS_BASE_PATHLOCATIONS_URI

+0

你的解释为我提供了我正在寻找的“大图片”澄清。谢谢! – littleK 2012-02-20 05:34:55