修改
谢谢大家的回答。我从他们中的许多人看到,在数据库适配器中编写自己的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}我完成使用后的对象。
我应该将其保存为SQLiteDatbase
实现的成员变量(并将其视为“私有单身”以供将来使用)?
我应该在退出ContentProvider
,query(...)
等功能时离开它,并相信insert(...)
会在以后的通话中为我管理它吗?
[在此处插入您的替代观点]
作为一个信任(或懒惰)的开发人员,我根据上面的第二个替代方案实现了我的代码。但我无法摆脱我忽视一些重要事情的令人毛骨悚然的感觉。
答案 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)
这取决于您对数据库的操作。如果您只是执行插入,删除或选择返回业务对象的位置,则可以在使用后立即关闭数据库。据我所知,它的设计只需关闭它并在需要时请求新的。
但是在使用游标时要小心,只要光标在使用中,就必须保持数据库处于打开状态。否则,当光标必须重新加载数据时,应用程序将崩溃。