我必须关闭SQLiteOpenHelper对象吗?

时间:2013-11-25 04:01:52

标签: android

我创建了一个SQLiteOpenHelper的对象,在运行dBMainHelper.EditRuleMain(规则)以保存资源后,我必须关闭dBMainHelper吗?

如果我没有运行dBMainHelper.close(),系统是否会自动释放资源?

    public static void EditRuleMain(MRule rule) {
        RuleMain dBMainHelper=new RuleMain(PublicPar.myContext);
        dBMainHelper.EditRuleMain(rule);
                 //Must I close?        
        dBMainHelper.close();
    }




public class RuleMain  extends SQLiteOpenHelper {

    private final static String DBName="smsforwardrulemain.db";
    private final static String TableRuleMain="rulemain";     

    public RuleMain(Context context) {
        super(context, DBName, null, DBPublicPar.DBVersion);  
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        String sql = "Create table " 
                + TableRuleMain
                + " (ruleID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
                + "enabled INTEGER NOT NULL," 
                + "incomingType INTEGER NOT NULL," 
                + "name TEXT NOT NULL" 
                + ");";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        String sql=" DROP TABLE IF EXISTS "+TableRuleMain;
        db.execSQL(sql); 
        onCreate(db);
    }   



    private List<MRule> GetMRuleListFromCursor(Cursor cursor) {
        List<MRule> myRuleMainList = new ArrayList<MRule>();
        while (cursor.moveToNext()) {
            MRule myMRule = new MRule();
            myMRule.ruleID = cursor.getInt(cursor.getColumnIndex("ruleID"));
            myMRule.name = cursor.getString(cursor.getColumnIndex("name"));
            myMRule.enabled = (cursor.getInt(cursor.getColumnIndex("enabled")) == 0) ? false: true;
            myMRule.incomingType= IncomingType.values()[cursor.getInt(cursor.getColumnIndex("incomingType"))];
            myRuleMainList.add(myMRule);
        }
        return myRuleMainList;
    }


    public int AddRuleMain(MRule rule) {        
        ContentValues cv=new ContentValues(); 
        FillRuleMainVaule( rule,cv);

        SQLiteDatabase db = this.getWritableDatabase(); 
        long rowid=db.insert(TableRuleMain, null, cv);
        db.close();     

        return (int)rowid;
    }

    public void EditRuleMain( MRule rule) {
        ContentValues cv=new ContentValues(); 
        FillRuleMainVaule( rule,cv);    

        SQLiteDatabase db = this.getWritableDatabase();
        db.update(TableRuleMain, cv, "ruleID = ?", new String[]{String.valueOf(rule.ruleID)});  
        db.close();
    }


}

1 个答案:

答案 0 :(得分:2)

是的,你应该明确地致电。

检查这些链接When should I call close() on SQLiteOpenHelper used by ContentProvider

Android Database Size Wont Decrease On HTC Thunderbolt

清楚地阅读第二个