如何关闭Application多个Activity,fragment和Cursor Loaders中的数据库资源

时间:2012-12-24 04:54:01

标签: android android-sqlite

DBHelper.java

public class DBHelper extends SQLiteOpenHelper{

    public DBHelper(Context context) {
        super(context, DBConstants.DATABASE_NAME, null,DBConstants.DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(DBConstants.CREATE_LOGINTABLE);
        db.execSQL(DBConstants.CREATE_DATA_TABLE);
        db.execSQL(DBConstants.CREATE_LATEST_DATA_TABLE);
        db.execSQL(DBConstants.CREATE_ALERTS_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL(DBConstants.DELETE_LOGINTABLE);
        db.execSQL(DBConstants.DELETE_DATA_TABLE);
        db.execSQL(DBConstants.DELETE_LATEST__DATA_TABLE);
        db.execSQL(DBConstants.DELETE_ALERTS_TABLE);
        onCreate(db);
    }

    @Override
    public synchronized void close() {
        super.close();
    }
}

Class1(应用程序中的一个活动或片段):

DBHelper myDbHelper=new DBHelper(context);
SQLiteDatabase myDB = myDbHelper.getWritableDatabase();

Cursor c1= myDB.query(DBConstants.LATEST_DATA_TABLE,mycolumns, null, null, null, null, null);
  /* is it correct */
c1.close();
myDB.close();
myDbHelper.close();
/* is it correct */

Class2(我在应用程序中的一个活动或片段):

DBHelper myDbHelper=new DBHelper(context);
SQLiteDatabase myDB = myDbHelper.getWritableDatabase();

Cursor c1= myDB.query(DBConstants.LATEST_DATA_TABLE,mycolumns, null, null, null, null, null);

/* is it correct */
c1.close();
myDB.close();
myDbHelper.close();
/* is it correct */

在这里,我想要关闭所有c1,myDB,myDbHelper对象还是关闭c1和myDbHelper就足够了?哪种是最佳做法?

1 个答案:

答案 0 :(得分:1)

  • myDbHelper.close()在内部关闭数据库。所以无需致电myDb.close
  • 当然,c1.close()是您想要习惯的最佳做法。

代码:

try {
    //your database queries.
} catch (...) {

} finally {
    if (cursor != null && !cursor.isClosed()) {
        c1.close();
    }
    myDbHelper.close();
}

finally块将确保无论发生什么都释放这些资源。