`

浅谈Android数据库CRUD操作的封装与实现(一)

阅读更多

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

这样就可以在你需要查寻数据的地方创建一个"SimpleMessageDao"对象来实现数据库的操作了。

比如要查询所有消息,并以ListView显示出来就很简单了(呵呵,再也不用被那个变态的"SimpleCursorAdapter"搞崩溃了吧!):

 

/**
 * 初始化消息列表
 */
public void initMessageListView(){
	ListView list = (ListView) Main.this.findViewById(R.id.message_list);
	
	//列表数据
	List<HashMap<String, String>> messageListData = new ArrayList<HashMap<String, String>>();

	//查询数据
	SimpleMessageDao smDao = new SimpleMessageDao(Main.this);
	List<SimpleMessage> messages = smDao.getScroolData(1, 20);
	
	//添加数据
	HashMap<String, String> message;
	for(SimpleMessage sm : messages){
		message = new HashMap<String, String>();
		message.put("id", String.valueOf(sm.getId()));
		message.put("content", sm.getContent());
		message.put("time", sm.getTime());
		messageListData.add(message);
	}

	//组装适配器
	SimpleAdapter adapter = new SimpleAdapter(
			Main.this,
			messageListData,
			R.layout.message_list_item,//列表条目的布局样式
			new String[]{"id", "content", "time"},//对应HashMap的Key
			new int[]{R.id.message_id, R.id.message_content, R.id.message_time});//对应TextView的id
	list.setAdapter(adapter);
	
	//设置条目监听器
	list.setOnItemClickListener(new OnItemClickListener(){
		@Override
		public void onItemClick(AdapterView<?> parent, View view,
				int position, long id) {
			ListView listView = (ListView) parent;
			@SuppressWarnings("unchecked")
			HashMap<String, String> data = (HashMap<String, String>) listView.getItemAtPosition(position);
			Toast.makeText(Main.this,
					"ID: " + data.get("id") + " \nContent: " + data.get("content") + "\nTime: " + data.get("time"),
					Toast.LENGTH_SHORT).show();
		}
		
	});
}
 

到目前为止,这个工具类还很简单。如果加上BeanUtils实现方向解析实体,整个代码会更加简洁。

2
0
分享到:
评论

相关推荐

    Hibernate与JDBC对于数据库CRUD操作性能示例

    Hibernate与JDBC对于数据库的性能操作对比事例,配置,更多信息资源

    android数据库的crud操作

    本文档主要介绍了Android中对于SQLite数据库的基本增删改查(CRUD)操作,并通过一个具体的例子——“SimpleMessage”实体的CRUD操作来详细说明如何在实际项目中实现这些功能。 #### 二、基础知识 在开始之前,我们先...

    利用享元模式封装数据库CRUD

    总结起来,利用享元模式封装数据库CRUD是一种高效的设计策略,它能够减少数据库操作的对象创建,提高系统的运行效率。通过共享DAO对象,我们不仅可以优化内存使用,还可以统一管理数据库连接,降低系统复杂度,同时...

    Python数据库CRUD操作全指南:从连接到实现

    CRUD操作是数据库编程的基础。在Python中,我们可以使用sqlite3模块进行SQLite数据库的操作,也可以通过第三方库...通过本文的示例,你应该能够掌握在Python中实现数据库CRUD操作的基本方法,并能够应用到实际项目中。

    android sqlite数据库封装 实现crud

    数据库的方式,常用在存储一系列的结构复杂的数据,轻量级的数据库SQlit使用起来还是比较简单,但是总想能像hibernate似的框架可以进行下封装,实现orm并且可以实现简单的rcud。项目中只有封装包,使用过程很简单,...

    jdbc资料(数据库crud操作)

    Apache的DBUtils是一个简单的数据库工具库,它封装了JDBC的一些繁琐操作,如处理结果集、异常处理等,使代码更加简洁、易读。主要特性有: 1. QueryRunner:提供了方便的SQL执行方法,如query()和update(),支持预...

    Android 对sqlite的封装,实现CRUD

    大家好,个人觉得用Sqlite数据库时,经常需要进行机械性的CRUD操作,故对其进行了一下封装,希望能起到抛砖引玉的作用。 目的:封装共有的CRUD 下面简单的说一下使用步骤,如果觉得多余,可以无视。 1. 实现自己...

    Java对数据库CRUD DEMO

    Java对数据库的CRUD(Create, Read, Update, Delete)操作是编程中常见的任务,尤其在Web应用开发中。这个DEMO提供了简化数据库交互的方法...这个DEMO是一个很好的起点,帮助你了解如何在Java中进行数据库的CRUD操作。

    Qt sqlite 数据库操作封装

    接着,打开数据库的操作与生成数据库类似,只需确保不指定数据库名称以创建新的,而是提供已存在的数据库路径。一旦数据库被打开,我们就可以通过QSqlQuery或QSqlTableModel等类执行SQL语句了。 对于执行SQL语句,...

    传智播客JDBC_完成对数据库的CRUD操作.rar

    在“06_传智播客JDBC_完成对数据库的CRUD操作”中,可能详细讲解了以上概念,并通过实例演示了如何在Java程序中实现这些操作。学习这个教程,开发者能够熟练掌握JDBC的基础用法,进一步提升数据库操作能力。同时,...

    android sqllite数据库crud+分页

    以上就是Android中SQLite数据库的CRUD操作和分页加载的基本实现。实际应用中,可能还需要考虑线程安全、事务处理、数据同步等问题。对于初学者来说,理解这些概念并能熟练运用,将为开发更复杂的Android应用打下坚实...

    Android数据库OrmLite框架封装详解完美好友列表Demo

    4. **操作数据库**:使用`OrmLiteDao`接口实例,可以方便地执行数据库操作。例如,添加好友: ```java Dao, Integer&gt; friendDao = helper.getFriendDao(); Friend newFriend = new Friend(); newFriend.setName...

    Android课程试验报告-实现数据库存储.docx

    总结来说,本实验报告详细展示了在Android应用中如何使用SQLite数据库进行数据管理,包括数据库的创建、表的建立以及基本的CRUD(创建、读取、更新、删除)操作。通过DbHelper和DbManager类的设计,实现了数据操作的...

    基于 Flask 的多数据库 CRUD 操作实践.zip

    这是一个基于 Flask 框架实现的跨数据库 CRUD(增删改查)操作实践项目。该项目演示了如何使用 Flask 与多种数据库(包括 sqLite、mySQL、MongoDB 和 PostgreSQL)进行交互,通过原始 SQL 查询实现数据库操作而非...

    ssh数据库基本操作封装

    在这个主题中,“ssh数据库基本操作封装”指的是将常用的数据库交互功能,如增删改查(CRUD),通过SSH框架进行封装,以便在项目中更方便地调用。这通常涉及到Spring的IoC(Inversion of Control)容器来管理数据库...

    Android数据库ContentProvider封装原理.pdf

    Android操作系统中的数据库管理是通过ContentProvider来实现的,而ContentProvider是一个抽象类,提供了标准化的接口来访问和管理应用程序的数据。ContentProvider可以提供对数据的CRUD(Create、Read、Update、...

    android中使用SQLite进行CRUD操作的实例

    这篇博客文章将通过一个名为"DBDemo"的实例,深入讲解如何在Android中进行SQLite的CRUD(创建、读取、更新和删除)操作。 首先,我们需要在Android项目中添加SQLite的依赖。在`build.gradle`文件的dependencies部分...

    Android数据库SQLite详解

    在Android开发中,SQLite是一个非常重要的组成部分,它是一个轻量级的、开源的、嵌入式的SQL数据库引擎,被广泛用于存储和管理应用程序中的数据。SQLite具有高效、可靠且易于集成的特点,使得它成为Android应用数据...

    MySQL数据库操作MFC封装类

    MySQL数据库操作MFC封装类是面向C++开发者的一种实用工具,它将MySQL数据库接口与Microsoft Foundation Classes (MFC)库相结合,提供了更便捷的数据库访问方式。MFC是微软为Windows应用程序开发提供的一套类库,它...

    Java数据库操作封装类

    为了简化这一过程并提高代码的可维护性和复用性,开发者通常会创建数据库操作的封装类。这样的类能够处理与数据库连接、查询、更新、插入和删除等相关的任务,使得业务逻辑代码更加专注于业务本身,而不是数据库交互...

Global site tag (gtag.js) - Google Analytics