简单的应用程序,但想要正确管理我的SQLite数据库

时间:2014-03-23 22:20:09

标签: android android-sqlite

我正在开发一个简单的应用程序来了解有关Android的更多信息。在取得进展的同时,我试图让它变得更好,但我必须说我对数据库管理非常困惑。

我的数据库非常简单:只有4列的单个表。

到目前为止:

1)一个非常标准的SQLiteOpenHelper派生类,名为MySQLiteHelper

2)名为Entry的模型类,表示行的内容

3)DAO课程:

public class EntriesDataSource {
    // Database fields
    private SQLiteDatabase database;
    private MySQLiteHelper dbHelper;
    private Context context;

    private String[] allColumns = { 
                    MySQLiteHelper.COLUMN_ID,
                    MySQLiteHelper.COLUMN_ENTRY_TYPE,
                    MySQLiteHelper.COLUMN_ACTUAL_ENTRY,
                    MySQLiteHelper.COLUMN_USER_EDITED_ENTRY };

    public EntriesDataSource(Context context) {
        this.context = context;
        dbHelper = new MySQLiteHelper(context);
    }

    public void open() throws SQLException {
        database = dbHelper.getWritableDatabase();
    }

    public void close() {
        dbHelper.close();
    }

    //.... Just showing some methods here, to give an idea .....

    public int updateDescription(long id, long entryType, String newDescription) {
        ContentValues values = new ContentValues();
        values.put(MySQLiteHelper.COLUMN_USER_EDITED_ENTRY, newDescription);

        if(entryType == MySQLiteHelper.ENTRY_TYPE_PURE_TEXT)
            values.put(MySQLiteHelper.COLUMN_ACTUAL_ENTRY, newDescription);

        return database.update(MySQLiteHelper.TABLE_ENTRIES, values,
            MySQLiteHelper.COLUMN_ID + " = ?", new String[] { String.valueOf(id) });
    }

    public Cursor getAllEntries() {
         return database.query(MySQLiteHelper.TABLE_ENTRIES,
            allColumns, null, null, null, null, MySQLiteHelper.COLUMN_USER_EDITED_ENTRY + " Collate NOCASE");
    }
}

4)我创建了自己的Application派生类,其中我有一个EntriesDataSource对象,我在Application的onCreate方法中创建它:

public class MyApplication extends Application {

    public static EntriesDataSource datasource;

    @Override
    public void onCreate() {
        super.onCreate();

        datasource = new EntriesDataSource(this);

    }

    public int updateDescription(long entryId, long entryType,
        String newDescription) {
        int rowsAffected = 0;

        datasource.open();
        rowsAffected = datasource.updateDescription(entryId, entryType,
            newDescription);
        datasource.close();

        return rowsAffected;
    }

    public Cursor getAllEntries() {
        datasource.open();
        Cursor cursor = datasource.getAllEntries();
        //datasource.close();
        return cursor;
    }

5)显示所有项目的ListActivity。到目前为止,我使用过ArrayAdapter。今天我决定尝试使用自定义的CursorAdapter,所以我采用了类似下面的方法,受到Busy Coder的Android指南的启发:

    public class ManageEntriesActivity extends ListActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);

                requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
                setContentView(R.layout.activity_manage_entries);

                new LoadCursorTask().execute();
        }



    private class LoadCursorTask extends AsyncTask<Void, Void, Void> {
    private Cursor entriesCursor=null;

    @Override
    protected Void doInBackground(Void... params) {
      entriesCursor=MyApplication.getInstance().getAllEntries();
      entriesCursor.getCount();

      return(null);
    }

    @Override
    public void onPostExecute(Void arg0) {
      ManageEntriesCustomCursorAdapter adapter;

        adapter=
            new ManageEntriesCustomCursorAdapter(
                                    getApplicationContext(),
                                    entriesCursor,
                                    0);

      setListAdapter(adapter);
    }
  }

您可以注意到,我曾经打开数据库连接,用它做任务,然后立即关闭它。使用ArrayAdapter方法可以很好地工作,但它不适用于CursorAdapter,因为我需要一个&#34; live&#34;游标:这就是为什么我在getAllEntries方法中注释掉db.close()的原因。

这种&#34;不对称&#34;但是,让我想知道我以后是否会遇到麻烦,因为在我打开数据库的地方看起来至少很奇怪,我就像虽然对于其他所有访问它,我也将关闭它。我确实尝试在线搜索最佳实践,但它只是增加了混乱,因为我找到了一些替代方案:

  • 只需打开数据库并保持打开状态(显然SQLiteOpenHelper会正确关闭它)

  • 尽快打开并关闭

  • 将它包装在ContentProvider中,它将处理所有事情

在我的案例中,最好的策略是什么?另外,如果您在我的代码中发现某些内容很奇怪,请指出: - )

提前致谢!

0 个答案:

没有答案