最难的 MVC 已经讲解过了。如果你可以在 android 上实现 MVC, 这系列剩下的部分将会很容易。奖赏一下自己吧,接下来我们要讨论一下数据持久化。
我会默认你已经知道 sqlite 和其他 android 中持久化的方法。如果不知道,现在是时候去补补了。我会建议你了解 Data Access Objects 或者叫 DAOs 的概念。这个概念非常简单:我们传递一个模型的实例给 DAOs ,由它来保存,更新或者删除数据。再也不用编写一大堆 sql 语句了。妈妈再也不用担心我调用数据库了。废话不说,看看代码:
:::java public class CounterDao { protected static final String TABLE = "Counter"; protected static final String _ID = "_id"; protected static final String LABEL = "label"; protected static final String COUNT = "count"; protected static final String LOCKED = "locked"; public CounterDao() { // } public ArrayList<CounterVo> getAll() { // ... truncated.... returns all CounterVos } public CounterVo get(int id) { SQLiteDatabase db = new DatabaseHelper().getWritableDatabase(); Cursor cursor = db.query(TABLE, null, _ID+"=?", new String[] {Integer.toString(id)}, null, null, null); CounterVo vo = null; if (cursor.moveToFirst()) { vo = new CounterVo(); vo.setId(cursor.getInt(cursor.getColumnIndex(_ID))); vo.setLabel(cursor.getString(cursor.getColumnIndex(LABEL))); vo.setCount(cursor.getInt(cursor.getColumnIndex(COUNT))); vo.setLocked(cursor.getInt(cursor.getColumnIndex(LOCKED)) == 1); } cursor.close(); db.close(); return vo; } public long insert(CounterVo counterVo) { SQLiteDatabase db = new DatabaseHelper().getWritableDatabase(); ContentValues values = new ContentValues(); if (counterVo.getId() > 0) values.put(_ID, counterVo.getId()); values.put(LABEL, counterVo.getLabel()); values.put(COUNT, counterVo.getCount()); values.put(LOCKED, counterVo.isLocked()); long num = db.insert(TABLE, null, values); db.close(); return num; } public int update(CounterVo counterVo) { // ... truncated.... } public void delete(int id) { SQLiteDatabase db = new DatabaseHelper().getWritableDatabase(); db.delete(TABLE, _ID+"=?", new String[]{Integer.toString(id)}); db.close(); } } CounterDao 就是用来持久化 CounterVo 的。里面的持久化实现可以使用 sqlite, json, xml 或者 shared preferences ,也就是外部不用知道内部是如何实现持久化的,调用接口就可以了。
...