在完成使用后,SQLiteOpenHelper实现检索的数据库怎么办?

时间:2011-03-11 08:48:03

标签: android sqlite

亲爱的Android开发者!


修改

谢谢大家的回答。我从他们中的许多人看到,在数据库适配器中编写自己的close()方法似乎是常见的(并且已接受)。很公平。

但是如何使用ContentProvider?通常在通过ContentProvider查询我的数据库时,我只需发出类似:

的内容
Cursor managedCursor = managedQuery(...);

我不知道如何使用此方法可以访问自定义close()实现中的自定义ContentProvider方法。我应该从我的Activity做出类似的事情:

MyCustomProvider myProvider = (MyCustomProvider) getContentResolver();

然后:

myProvider.query(...);
myProvider.close();

最重要的是;这是否有必要(截至下文第2点)?

结束编辑


在某种程度上,我必须说我得到SQLiteOpenHelper的概念,它是什么,它是如何使用的等等。当我写自己的ContentProvider时,我甚至经常使用它。

问题是我不知道如何对SQLiteDatabase对象做什么,由myOpenHelper.getWritableDatabase()(或myOpenHelper.getReadableDatabase()函数返回,当我完成时)用它。

根据Android ContentProvider.onCreate()文档:

  

在使用内容提供程序(通过query(Uri, String[], String, String[], String)insert(Uri, ContentValues)等)之前,您应该推迟非常重要的初始化(例如打开,升级和扫描数据库)。

     

[...]

     

如果您使用SQLiteOpenHelper,请务必避免使用此方法调用getReadableDatabase()getWritableDatabase()。 (相反,覆盖onOpen(SQLiteDatabase)以在数据库首次打开时初始化数据库。)

上面给出了一个提示初始化数据库(query(...)insert(...)等功能)的提示,但它没有告诉我如何处理创建的{{1}我完成使用后的对象。

  1. 我应该将其保存为SQLiteDatbase实现的成员变量(并将其视为“私有单身”以供将来使用)?

    < / LI>
  2. 我应该在退出ContentProviderquery(...)等功能时离开它,并相信insert(...)会在以后的通话中为我管理它吗?

  3. [在此处插入您的替代观点]

  4. 作为一个信任(或懒惰)的开发人员,我根据上面的第二个替代方案实现了我的代码。但我无法摆脱我忽视一些重要事情的令人毛骨悚然的感觉。

3 个答案:

答案 0 :(得分:0)

我猜你应该关闭它,例如在使用它的活动的onDestroy()中。

所以在我的DBAdapter类中我有:

/**
 * Close the database
 */
 public void close() {
     mDb.close();   //mDb was obtained using mDbHelper.getWritableDatabase();
 }

在我的活动中:

 public void onCreate(Bundle bundle){
     ...
     mDBAdapter = new DBAdapter(this);
    // Open or create the database
    mDBAdapter.open();
 }    

@Override
public void onDestroy() {
    // Close the database
    mDBAdapter.close();
    super.onDestroy();        
}

不确定这是否适合您的提供商概念。

答案 1 :(得分:0)

如果您在Android的API中查看该对象的使用示例,您可以看到该对象刚刚使用,但不需要关闭。

他们实现了close()方法,但我还没有看到他们使用它。

答案 2 :(得分:0)

这取决于您对数据库的操作。如果您只是执行插入,删除或选择返回业务对象的位置,则可以在使用后立即关闭数据库。据我所知,它的设计只需关闭它并在需要时请求新的。

但是在使用游标时要小心,只要光标在使用中,就必须保持数据库处于打开状态。否则,当光标必须重新加载数据时,应用程序将崩溃。