0

我正在開發一個android 3.1應用程序。軟件設計:數據庫打開和關閉的位置

這個問題並不是針對Android的,而是關於如何設計一個訪問數據庫的類。我在這裏問,因爲我的代碼是Android。

我有一個類,DBManager,與一起使用Sqlite數據庫。這是它的實現的一部分:

public class DBManager 
{ 
    // Variable to hold the database instance 
    private SQLiteDatabase db; 
    // Database open/upgrade helper 
    private DatabaseHelper dbHelper; 

    public DBManager(Context _context) 
    { 
     Log.v("DBManager", "constructor"); 
     dbHelper = new DatabaseHelper(_context, SqlConstants.DATABASE_NAME, null, SqlConstants.DATABASE_VERSION); 
    } 

    public DBManager open() throws SQLException 
    { 
     Log.v("DBManager", "open"); 
     db = dbHelper.getWritableDatabase(); 
     return this; 
    } 

    public void close() 
    { 
     Log.v("DBManager", "close"); 
     db.close(); 
    } 

     ... 

     /** 
    * Query all forms available locally. 
    * @return A list with all forms (form.name and form.FormId) available on local db 
    * or null if there was a problem. 
    */ 
    public ArrayList<Form> getAllForms() 
    { 
     Log.v("DBManager", "getAllForms"); 
     ArrayList<Form> list = null; 
     Cursor c = null; 

     try 
     { 
      c = this.getAllFormsCursor(); 
      if (c != null) 
      { 
       int formNameIndex = c.getColumnIndex(SqlConstants.COLUMN_FORM_NAME); 
       int formIdIndex = c.getColumnIndex(SqlConstants.COLUMN_FORM_ID); 

       c.moveToFirst(); 
       if (c.getCount() > 0) 
       { 
        list = new ArrayList<Form>(c.getCount()); 
        do 
        { 
         Form f = new Form(); 
         f.Name = c.getString(formNameIndex); 
         f.FormId = c.getString(formIdIndex); 
         list.add(f); 
        } 
        while (c.moveToNext()); 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
      list = null; 
     } 
     finally 
     { 
      if (c != null) 
       c.close(); 
     } 
     return list; 
    } 

    private Cursor getAllFormsCursor() 
    { 
     Log.v("DBManager", "getAllFormsCursor"); 

     return db.query(SqlConstants.TABLE_FORM, 
       new String[] { 
       SqlConstants.COLUMN_FORM_ID, 
       SqlConstants.COLUMN_FORM_NAME}, null, null, null, null, null); 
    } 
} 

這是使用DBManager一個的AsyncTask:

private class DbFormListAsyncTask extends AsyncTask<Void, Void, ArrayList<Form>> 
{ 
    private Context mContext; 
    private ProgressDialog loadingDialog; 
    private DBManager dbMan; 

    DbFormListAsyncTask(Context context) 
    { 
     this.mContext = context; 
     loadingDialog = new ProgressDialog(mContext); 
     loadingDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     loadingDialog.setMessage("Retriving forms. Please wait..."); 
     loadingDialog.setCancelable(false); 
     loadingDialog.show(); 
    } 

    @Override 
    protected ArrayList<Form> doInBackground(Void... arg0) 
    { 
     dbMan = new DBManager(mContext); 
     dbMan.open(); 

     return dbMan.getAllForms(); 
    } 

    protected void onPostExecute(ArrayList<Form> forms) 
    { 
     if (forms != null) 
     { 
      ListActivity act = (ListActivity) mContext; 
      act.setListAdapter(new AvaFormAdapter(act, R.layout.ava_list_item, forms)); 
     } 
     else 
     { 
      TextView errorMsg = (TextView) 
        ((FormsListActivity) mContext).findViewById(R.id.formErrorMsg); 
      errorMsg.setText("Problem getting forms. Please try again later."); 
     } 
     loadingDialog.dismiss(); 
     if (dbMan != null) 
      dbMan.close(); 
    } 
} 

正如你可以看到我有:

  1. 創建DBManager實例。
  2. 打開數據庫dbMan.open()
  3. 呼叫dbMan.getAllForms()
  4. dbMan.close()onPostExecute關閉數據庫。

我以爲我可以在dbMan.getAllForms()添加db.open()和db.close(),以避免每次我用dbMan.getAllForms()時間調用它。

您對此有何看法?什麼是最好的方法?

+0

您應該看看裝載機:http://developer.android.com/guide/topics/fundamentals/loaders.html – 2012-04-19 10:05:09

回答

0

我會把它裏面getAllForms()或做類似的東西

protected ArrayList<Form> doInBackground(Void... arg0) 
{ 
    dbMan = new DBManager(mContext); 
    dbMan.open(); 
    ArrayList<Form> resutl = dbMan.getAllForms(); 
    dbMan.close(); 
    return result; 
} 

既然你不需要的數據庫連接你可以關閉它的時候了結果之後。

編輯:如果您多次運行該AsyncTask,然後打開/關閉將引入不必要的開銷。在這種情況下,您可能希望從您的Activity中啓動dbManager(也許在DbManager的構造函數中使用open()),並在您離開活動後關閉它。然後將Dbmanager傳遞給AsyncTask。

0

使您的數據庫輔助類成爲單例,並且不顯式關閉SQLiteDatabase。當您的應用程序退出時,它將被關閉並刷新。