的标准方法:
一般来说,如果你有自己写的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
...
}
这会自动调用ContentProvider的是能够处理给定的内容URI,给你注册在manifest.xml文件中像
<provider android:name="MyContentProvider" android:authorities="com.mycompany.contentprovider.MyContentProvider" />
我总是建议人们看看Notepad example,以了解ContentProvider应该如何实现。
替代方案:
一般来说,如果你只是需要你的活动范围内访问您的数据我会坚持的“标准做法”使用ContentProviders,其中顺便说一句。可能使它成为最灵活的解决方案。
如果您的解决方案需要来访问也没有“managedQuery”metods的非Activity类的数据,那么您可以自己实现某种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);
...
。希望你指出了正确的方向:)
谢谢您的回答树里,但我想你也许误解了问题。我已经有了一个内容提供者和一个数据访问对象。 (我从上面稍微修改了一些问题,使它们更清晰一些)。 1.我如何(如果它甚至可能的话)从Activity外部(在我的数据访问对象内)管理游标生命周期? 2.每个活动是否应该创建此数据访问对象的实例并将上下文的实例传递给它?也许DAO应该公开静态方法,以便每个活动不需要创建数据访问对象的实例? – Brian 2010-08-31 08:09:59
我提供了一个处理活动外光标的例子,即在你的DAO对象中。当然,你应该考虑创建你的dao对象的单例实例,如果你关心的话,静态的实例通常对单元测试不好。 – Juri 2010-08-31 18:37:59