标签:database android sqlite cursor
在使用android时,我已经阅读了大量有关如何创建和使用数据库连接的博客和教程.虽然我有很多工作示例,但不同的实现会导致不同的问题.
例如,我使用数据源类,数据源和数据库助手类DBManagement.
数据源
public class DataSource {
// Database fields
private SQLiteDatabase database;
private DBManagement dbHelper;
public SMSDataSource(Context context) {
dbHelper = new DBManagement(context);
}
public void open() throws SQLException {
if(database == null){
database = dbHelper.getWritableDatabase();
}
}
public Cursor exampleCursor(long constraint){
Cursor cur = database.query(DBManagement.TABLE_NAME,
new String[] {DBManagement.Column}, "constraint="+constraint, null, null, null, null);
return cur;
}
//.. other methods down here which do rawQuery, QueryBuilder, etc..
DBManagement
public class DBManagement extends SQLiteOpenHelper{
// .. table definitions and columns etc ..//
public DBManagement(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
在活动中的onCreate方法中,我将调用datasource.open()并且SQL连接已打开.之后我会做:
DataSource datasource = new DataSource();
Cursor cursor = datasource.exampleCursor(1);
startManagingCursor(cursor);
如果我导航到新活动,我会收到以下错误:
06-27 21:59:14.812: E/Database(13396): close() was never explicitly called on database '/data/data/com.example.package/databases/db.db'
如果我添加datasource.close();到onCreate的末尾,没有简单的游标适配器工作,或者如果在conextual菜单上执行操作,我得到db未打开的错误.
处理上述问题的最佳方法是什么?
所以我做了以下,我仍然遇到数据库问题:
@Override
public void onBackPressed() {
// do something on back.
//Log.i(getClass().toString(), "onBackPressed");
datasource.close();
finish();
return;
}
@Override
protected void onResume(){
super.onResume();
onCreate(null);
}
@Override
protected void onRestart(){
datasource = new DataSource(this);
datasource.open();
filters = datasource.getFilterCursor();
startManagingCursor(filters);
super.onRestart();
}
@Override
protected void onPause(){
//Log.i(getClass().toString(), "onPause");
((CursorAdapter) adapter).getCursor().close();
datasource.close();
super.onPause();
}
@Override
protected void onStop(){
//Log.i(getClass().toString(), "onStop");
datasource.close();
super.onStop();
}
我的Datasource.java类具有以下内容:
public Datasource(Context context){
dbHelper = new DBManagement(context);
}
public void open() throws SQLException {
if( database == null ){
database = dbHelper.getWritableDatabase();
}
}
public void close(){
if(dbHelper != null){
dbHelper.close();
}
}
解决方法:
这其实很简单:
>完成后显式关闭所有游标(最后使用)等.
>不要使用startManagingCursor()
>使你的数据库包装/助手/经理/无论什么类单身
>不要在数据库助手上显式调用close().当您的流程终止时,我将自动关闭.
另外:频繁的打开和关闭绝对是一个坏主意,因为它带来了相当多的开销.
使用装载机也是一种选择.您绝对不需要使用内容提供程序来使用加载程序,但它并不是那么简单.使用内容提供商涉及IPC,如果您不打算将数据导出到其他应用程序,则通常会出现过度杀伤.
标签:database,android,sqlite,cursor 来源: https://codeday.me/bug/20190712/1444343.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。