我正在开发一个简单的应用程序来了解有关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中,它将处理所有事情
在我的案例中,最好的策略是什么?另外,如果您在我的代码中发现某些内容很奇怪,请指出: - )
提前致谢!