的標準方法:
一般來說,如果你有自己寫的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