0

Android 3.1 アプリケーションを開発しています。

この質問は Android に固有のものではなく、データベースにアクセスするクラスを設計する方法に関するものです。私のコードはAndroid用なので、ここで尋ねました。

Sqlite データベースDBManagerを操作するためのクラスがあります。これはその実装の一部です:

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);
    }
}

そして、これは以下を使用する AsyncTask ですDBManager

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()on でデータベースを閉じますonPostExecute

db.open() と db.close() を追加しdbMan.getAllForms()て、使用するたびに呼び出さないようにできると思いましたdbMan.getAllForms()

これについてあなたはどう思いますか?最善のアプローチは何ですか?

4

2 に答える 2

0

I would put it inside getAllForms() or do something like that

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

結果が得られた後は db 接続は必要ないため、すぐに閉じることができます。

編集: その AsyncTask を数回実行すると、開いたり閉じたりすると不要なオーバーヘッドが発生します。その場合、アクティビティから dbManager をインスタンス化し (おそらく DbManager のコンストラクターで open())、アクティビティを離れたら閉じます。次に、Dbmanager を AsyncTask に渡します。

于 2012-04-19T10:08:09.713 に答える