我有关于数据访问的一般Android设计问题。我的应用程序中有许多需要访问SQLite数据库的活动。为了在一个地方包装所有数据访问逻辑,我创建了一个DatbaseHandler类来处理所有数据访问逻辑。此类负责构建where子句,调用数据库并询问结果游标以检索查询结果并将其返回给调用者。此类的目的是将所有数据访问代码包装在一个位置,以便可以轻松地管理和维护它,而不是将数据访问逻辑分散在所有活动中。需要访问数据库的每个活动都会创建此DatabaseHandler类的实例,并向其传递android.content.Context的引用。然后,DatabaseHandler类使用此Context对象调用底层内容提供程序,如下所示context_i.getContentResolver()。query(...)。
我的数据访问逻辑(特定于游标处理逻辑)不在活动中,因此我无法管理游标生命周期,因此可能存在内存泄漏。
我的问题如下 -
我真的想了解最佳方法。任何建议将不胜感激
答案 0 :(得分:2)
标准方法:
通常,如果您有自己编写的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" />
我总是建议人们查看Notepad example,了解应该如何实施ContentProviders。
<强>备选方案:强>
一般来说,如果您需要在活动中访问您的数据,我会坚持使用ContentProviders的“标准方法”,顺便说一下。可能使它成为最灵活的解决方案
如果您的解决方案需要也可以从没有“managedQuery”方法的非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);
...
希望能指出正确的方向:)