浅谈Android数据库CRUD操作的封装与实现(一)
2011-01-16 08:56:00 来源:WEB开发网核心提示:Android系统内部集成了SQLite数据库,可是杯具的却没有Android系统可用的Hibernate,浅谈Android数据库CRUD操作的封装与实现(一),想当初做JavaEE时有Hibernate在手的那个飘逸,我尝试用JavaEE的思路封装了一个类似的工具包,上代码:/** * 简单消息DAO * SQLi
Android系统内部集成了SQLite数据库,可是杯具的却没有Android系统可用的Hibernate。
想当初做JavaEE时有Hibernate在手的那个飘逸,我尝试用JavaEE的思路封装了一个类似的工具包。(感谢“编程浪子”在JavaEE上给我的帮助)
首先,晒晒我的包结构:

大家可以看到,我在项目中创建了两个SourceFolder。其中core文件夹下存放的都是通用代码,可以在其他项目中重复使用(当然最好是导出jar包了)。org.dw.core.utils包下是一些工具类,所提供的都是静态方法(可以开源的)。org.dw.core.db包下就是数据库的操作工具了。EntityDao是一个泛型接口,定义了CRUD的方法,其他实体DAO都要实现她。目前只做到这一步,下一步将利用反射实现更高级的封装。
/**
* 基本DAO接口
* @author EwinLive
*
* @param <T>
* @param <PK>
*/
public interface EntityDao<T, PK extends Serializable> {
/**
* 添加
* @param entity
*/
void save(final T entity);
/**
* 移除记录(指定ID集)
* @param ids 可以有多个
*/
void remove(final PK... ids);
/**
* 更新
* @param entity
*/
void upDate(final T entity);
/**
* 按ID查询对象
* @param id
* @return
*/
T find(final PK id);
/**
* 分页查询
* @param startResult 开始位置
* @param maxResult 记录容量
* @return
*/
List<T> getScroolData(Integer startResult, Integer maxResult);
/**
* 返回记录总数
* @return
*/
public Long getCount();
}我的项目中要对消息实体"SimpleMessage"实现数据库的CRUD操作,只需要创建一个实现了"EntityDao"接口的"SimpleMessageDao"(可以观察一下包的位置)。这样做不仅可以简化代码结构,而且可以大大减少SQL语句的编写。
上代码:
/**
* 简单消息DAO
* SQLite
* dbHelper
* @author EwinLive
*
*事务处理示例:
SQLiteDatabase sdb = dbHelper.getReadableDatabase();
sdb.beginTransaction();//开启事务
try {
sdb.execSQL("XXXXX");
sdb.execSQL("YYYYY");
sdb.setTransactionSuccessful();//设置事务成功标志
} catch (SQLException e) {
e.printStackTrace();
}
sdb.endTransaction();//提交事务
*/
public class SimpleMessageDao implements EntityDao<SimpleMessage, Integer> {
/**
* 表名
*/
public static final String TABLE = "simple_message";
/**
* 数据库管理器
* 注意:dbHelper.getReadableDatabase(),会先以可读写方式访问数据库,当磁盘空间已满时会切换到只读方式。
*/
DataBaseHelper dbHelper;
public SimpleMessageDao(Context context) {
super();
dbHelper = new DataBaseHelper(context);
}
@Override
public void save(SimpleMessage entity) {
dbHelper.getReadableDatabase().execSQL(
"insert into "+ TABLE +"(title, content, time, accountId, consumerId) values(?,?,?,?,?)",
new Object[]{entity.getTitle(),entity.getContent(),entity.getTime(),entity.getAccountId(),entity.getConsumerId()});
}
@SuppressWarnings("unused")
@Override
public void remove(Integer... ids) {
if(ids.length > 0){
StringBuffer sb = new StringBuffer();
for(Integer id : ids){
sb.append('?').append(',');
}
sb.deleteCharAt(sb.length() - 1);
dbHelper.getReadableDatabase().execSQL(
"delete from "+ TABLE +" where id in(" + sb + ")", (Object[]) ids);
}
}
@Override
public void upDate(SimpleMessage entity) {
dbHelper.getReadableDatabase().execSQL(
"update "+ TABLE +" set title=?, content=?, time=?, accountId=?, consumerId=? where id =?",
new Object[]{entity.getTitle(),entity.getContent(),entity.getTime(),entity.getAccountId(),entity.getConsumerId(),entity.getId()});
}
@Override
public SimpleMessage find(Integer id) {
Cursor cursor = dbHelper.getReadableDatabase().rawQuery("select * from " + TABLE + " where id=?",
new String[]{String.valueOf(id)});
if(cursor.moveToNext())
return new SimpleMessage(cursor.getInt(0),cursor.getString(1),cursor.getString(2),cursor.getString(3),cursor.getInt(4),cursor.getInt(5));
return null;
}
@Override
public List<SimpleMessage> getScroolData(Integer startResult,
Integer maxResult) {
List<SimpleMessage> messages = new ArrayList<SimpleMessage>(0);
Cursor cursor = dbHelper.getReadableDatabase().rawQuery("select * from " + TABLE + " limit ?, ?",
new String[]{String.valueOf(startResult), String.valueOf(maxResult)});
while(cursor.moveToNext()){
messages.add(new SimpleMessage(cursor.getInt(0),cursor.getString(1),cursor.getString(2),cursor.getString(3),cursor.getInt(4),cursor.getInt(5)));
}
return messages;
}
@Override
public Long getCount() {
Cursor cursor = dbHelper.getReadableDatabase().rawQuery("select count(*) from " + TABLE,
null);
if(cursor.moveToNext())
return cursor.getLong(0);
return 0l;
}
}- ››Android 当修改一些代码时,使用什么编译命令可以最...
- ››Android 如何添加一个apk使模拟器和真机都编译进去...
- ››Android 修改Camera拍照的默认保存路径
- ››Android 如何修改默认输入法
- ››android开发中finish()和System.exit(0)的区别
- ››Android手势识别简单封装类
- ››android中查看项目数字证书的两种方法
- ››Android中获取IMEI码的办法
- ››android 相机报错 setParameters failed
- ››Android重启运用程序的代码
- ››Android为ListView的Item设置不同的布局
- ››android bitmap与base64字符串的互相转换
更多精彩
赞助商链接
