标准方法:
通常,如果您有自己编写的 ContentProvider 并且在您的 manifest.xml 文件中正确注册了它,您可以这样做(例如)
@Override
public void onCreate(Bundle savedInstanceState){
...
if (getIntent().getData() == null) {
getIntent().setData(MyMetaData.CONTENT_URI);
}
Cursor cursor = managedQuery(getIntent().getData(), null, null, null, null);
//create an appropriate adapter and bind it to the UI
...
}
这将自动调用能够处理给定内容 uri 的 ContentProvider,前提是您已将其注册到 manifest.xml 文件中,例如
<provider android:name="MyContentProvider" android:authorities="com.mycompany.contentprovider.MyContentProvider" />
我总是建议人们看看记事本示例 http://developer.android.com/guide/tutorials/notepad/index.html了解如何实施 ContentProvider。
备择方案:
一般来说,如果您需要在活动中访问数据,我会坚持使用 ContentProviders 的“标准方法”,顺便说一句。可能使其成为最灵活的解决方案。
如果你的解决方案needs要从没有“托管查询”方法的非活动类访问数据,那么您可以自己实现某种 DAO(数据访问对象)类。一个例子可以是
public class MyDataDao implements IMyDataDao {
private ContentResolver contentResolver;
public MyDataDao(ContentResolver contentResolver){
this.contentResolver = contentResolver;
}
@Override
public MyDataObject readMyDataObjectById(long id){
MyDataObject result = null;
Cursor myDataObjectCursor = contentResolver.query(...);
if(myDataObjectCursor != null && myDataObjectCursor.moveToFirst()){
result = new MyDataObject();
result.setTitle(myDataObjectCursor.get..);
...
}
myDataObjectCursor.close();
return result;
}
}
这也可能有效。然后你调用你的 DAO
IMyDataDao dao = new MyDataDao(context.getContentResolver());
MyDataObject anObj = dao.readMyDataObjectById(10);
...
希望这为您指明了正确的方向:)