Android数据库访问设计方法

Bri*_*ian 5 android

我有关于数据访问的一般Android设计问题.我的应用程序中有许多需要访问SQLite数据库的活动.为了在一个地方包装所有数据访问逻辑,我创建了一个DatbaseHandler类来处理所有数据访问逻辑.这个类负责构建where子句,调用数据库并询问结果游标以检索查询结果并将它们返回给调用者.此类的目的是将所有数据访问代码包装在一个位置,以便可以轻松地管理和维护它,而不是将数据访问逻辑分散在所有活动中.需要访问数据库的每个活动都会创建此DatabaseHandler类的实例,并向其传递android.content.Context的引用.

我的数据访问逻辑(游标处理逻辑是特定的)不在活动中,因此我无法管理游标生命周期,因此可能存在内存泄漏.

我的问题如下 -

  1. 我怎样才能(如果可能的话)从活动外部管理游标生命周期?
  2. 每个活动是否应该创建此数据处理程序类的实例并将Context的实例传递给它?也许我的设计方法是错误的,我应该将这些数据访问函数公开为静态方法,将调用活动的实例作为参数.这样我可以执行托管查询并让活动负责管理游标生命周期?

我真的很想了解最好的方法.任何建议将不胜感激

Jur*_*uri 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
   ...
}
Run Code Online (Sandbox Code Playgroud)

这将自动调用能够处理给定内容 uri 的 ContentProvider,前提是您已将其注册到 manifest.xml 文件中,例如

<provider android:name="MyContentProvider" android:authorities="com.mycompany.contentprovider.MyContentProvider" />
Run Code Online (Sandbox Code Playgroud)

我总是建议人们看一下记事本示例,以了解如何实现 ContentProvider。

替代方案:
一般来说,如果您需要在活动中访问数据,我会坚持使用 ContentProviders 的“标准方法”,顺便说一句。可能使其成为最灵活的解决方案。
如果您的解决方案还需要从没有“托管查询”方法的非活动类访问数据,那么您可以自己实现某种 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;
   }
}
Run Code Online (Sandbox Code Playgroud)

这也可能有效。然后你调用你的 DAO

IMyDataDao dao = new MyDataDao(context.getContentResolver());
MyDataObject anObj = dao.readMyDataObjectById(10);
...
Run Code Online (Sandbox Code Playgroud)

希望这为您指明了正确的方向:)