`
ssrc0604hx
  • 浏览: 8984 次
文章分类
社区版块
存档分类
最新评论

【android开发记录片】3.数据库SQLite 的对象封装

 
阅读更多

在学习android时,做了一个简单的数据表与javaBean的映射,思路是:

定义一个Entity 的泛型抽象类,然后XXXDao 类继承于Entity,变成实体操作类,最后的bean实现序列化接口即可。

下面以一个“分类”为例说明一下:

首先是Entity.java的定义:

package org.nerve.cellnote.storage;

import java.io.Serializable;
import java.util.ArrayList;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

/**
 * @项目名称 :CellNote
 * @文件名称 :Entity.java
 * @所在包 :org.nerve.cellnote.storage
 * @功能描述 :
 *	是一个范型抽象类,模拟 JPA 形式,封装数据库的常用操作,子类必须实现如下方法以达到数据绑定:<br />
 *		public abstract String getDBName();	//绑定的表名  <br />
 *		public abstract String getCreateSQL();	//表的构造sql语句,在建表时使用  <br />
 *		public abstract String[] getColumns();	//表列	<br />
 *		public abstract T bind(Cursor c);	//实体的数据注入	<br />
 *	<br />
 * @创建者 :集成显卡	1053214511@qq.com
 * @创建日期 :2013-1-21
 * @修改记录 :
 */
public abstract class Entity<T extends Serializable> {
	protected Context context;
	
	public Entity(Context c){
		context = c;
	}
	
	/**
	 * @方法名称 :getDBName
	 * @功能描述 :对应的表名
	 * @return
	 * @return :String
	 */
	public abstract String getDBName();
	
	/**
	 * @方法名称 :getCreateSQL
	 * @功能描述 :创建表的SQL
	 * @return
	 * @return :String
	 */
	public abstract String getCreateSQL();
	
	/**
	 * @方法名称 :getColumns
	 * @功能描述 :得到字段
	 * @return
	 * @return :String[]
	 */
	public abstract String[] getColumns();
	
	/**
	 * @方法名称 :bind
	 * @功能描述 :传入一个Cursor,绑定到实体中
	 * @param c
	 * @return :void
	 */
	public abstract T bind(Cursor c);
	
	public SQLiteDatabase getDB(){
		return new DBManager(context).getDB();
	}
	
	public T getById(int id){
		Cursor c = query("_id="+id, null, null, null, null);
		if(c.moveToFirst())
			return bind(c);
		else
			return null;
	}
	
	/**
	 * @方法名称 :getBy
	 * @功能描述 :
	 * 
	 *	@param column 查询的字段
	 *	@param value	值
	 *	@return
	 */
	public T getBy(String column, String value){
		Cursor c = query(column+"=?", new String[]{value}, null, null, null);
		if(c.moveToFirst() == false)
			return null;
		return bind(c);
	}
	
	/**
	 * @方法名称 :getAll
	 * @功能描述 :返回所有记录
	 * 
	 *	@return
	 */
	public ArrayList<T> getAll(){
		Cursor c = query(null, null, null, null, getDefaultOrderBy());
		ArrayList<T> result = new ArrayList<T>();
		
		while(c.moveToNext()){
			T temp = bind(c);
			result.add(temp);
		}
		
		c.close();
		return result;
	}
	
	/**
	 * @方法名称 :getList
	 * @功能描述 :根据条件得到数据列表
	 * 
	 *	@param column	匹配的字段
	 *	@param value	字段值
	 *	@param orderBY	排序方式
	 *	@return
	 */
	public ArrayList<T> getList(String column, String values, String orderBY){
		Cursor c = query(column+"=?", new String[]{values}, null, null, orderBY);
		ArrayList<T> result = new ArrayList<T>();
		
		while(c.moveToNext()){
			T temp = bind(c);
			result.add(temp);
		}
		
		c.close();
		return result;
	}
	
	public ArrayList<T> getListLike(String where, String[] values, String orderBY){
		Cursor c = query(where, values, null, null, orderBY);
		ArrayList<T> result = new ArrayList<T>();
		
		while(c.moveToNext()){
			T temp = bind(c);
			result.add(temp);
		}
		
		c.close();
		return result;
	}
	
	/**
	 * @方法名称 :query
	 * @功能描述 :得到一个游标,数据表名和字段都是使用默认的
	 * @param where
	 * @param argsW
	 * @param groupBy
	 * @param having
	 * @param orderBy
	 * @return
	 * @return :Cursor
	 */
	public Cursor query(String where, String[] argsW, String groupBy, String having, String orderBy){
		DBManager db = new DBManager(context);
		
		return db.getDB().query(getDBName(), getColumns(), where, argsW, groupBy, having, orderBy);
	}
	
	/**
	 * @方法名称 :getDefaultOrderBy
	 * @功能描述 :得到默认的排序方式。如果子类有特别要求,重写这个方法
	 * @return
	 * @return :String
	 */
	public String getDefaultOrderBy(){
		return null;
	}
	
	/**
	 * @方法名称 :insert
	 * @功能描述 :
	 * @param cv
	 * @return 返回新增数据行的id,如果出错返回-1
	 * @return :long
	 */
	public long insert(ContentValues cv){
		return getDB().insert(getDBName(), null, cv);
	}
	
	public int update(ContentValues cv, String where, String[] whereArgs){
		return getDB().update(getDBName(), cv, where, whereArgs);
	}
	
	/**
	 * @方法名称 :delById
	 * @功能描述 :根据id删除数据行,返回的是删除的行数
	 * 
	 *	@param id
	 *	@return
	 */
	public int delById(int id){
		return getDB().delete(getDBName(), "_id="+id, null);
	}
	
	/**
	 * @方法名称 :delBy
	 * @功能描述 :根据条件删除数据行,返回的是删除的行数
	 * 
	 *	@param column
	 *	@param value
	 *	@return
	 */
	public int delBy(String column, String value){
		return getDB().delete(getDBName(), column+"=?", new String[]{value});
	}
}


再定义bean : Category.java

package org.nerve.cellnote.domain;

import java.io.Serializable;

/**
 * @项目名称 :CellNote
 * @文件名称 :Category.java
 * @所在包 :org.nerve.cellnote.domain
 * @功能描述 :
 *	便签的分类
 * @创建者 :集成显卡	1053214511@qq.com
 * @创建日期 :2013-1-21
 * @修改记录 :
 */
@SuppressWarnings("serial")
public class Category implements Serializable{
	public int id;
	public String name;
	public int parentId;
	
	public Category(){
		
	}
	
	public Category(String name){
		this.name = name;
	}
}


最后是CategoryDao.java:

package org.nerve.cellnote.domain;

import org.nerve.cellnote.storage.Entity;

import android.content.Context;
import android.database.Cursor;

public class CategoryDao extends Entity<Category>{

	public CategoryDao(Context c) {
		super(c);
	}

	@Override
	public String getDBName() {
		return "category";
	}

	@Override
	public String getCreateSQL() {
		StringBuilder sb = new StringBuilder();
		sb.append("create table "+getDBName()+" (_id integer primary key autoincrement," +
				"name text,parentId integer);");
		
		return sb.toString();
	}

	@Override
	public String[] getColumns() {
		return new String[]{"_id","name","parentId"};
	}

	/**
	 * 在这里,使用了 getColumns()  的顺序获得数据项
	 */
	@Override
	public Category bind(Cursor c) {
		Category cg = new Category();
		cg.id = c.getInt(0);
		cg.name = c.getString(1);
		cg.parentId = c.getInt(2);
		return cg;
	}

}


DAO 类中重写指定的方法就可以了。

对于获取数据,可以这样:

CategoryDao categoryDao = new CategoryDao(context);
return getCategoryDao().getById(id);


可以将这些操作封装在一个Service层中,方便管理。

分享到:
评论

相关推荐

    Android源码——数据库SQLite.zip

    这个压缩包文件"Android源码——数据库SQLite.zip"可能包含了关于Android中SQLite数据库的源码分析、使用示例以及相关的图像资源,如1-120912223R80-L.png,可能用于解释或展示SQLite在Android中的工作原理。...

    Nodejs操作Sqlite3数据库封装

    本篇文章将深入探讨如何使用`node-sqlite3`库来操作SQLite3数据库,并对其进行封装,以便于在实际项目中更高效地使用。 首先,`node-sqlite3`是Node.js的一个数据库驱动,它提供了与SQLite3数据库交互的接口。安装...

    System.Data.SQLite.DLL C# 读写sqlite数据库

    System.Data.SQLite.DLL 是一个用于 .NET Framework 的 SQLite 数据库引擎的 ADO.NET 提供程序。这个库使得 C# 开发者能够方便地在他们的应用程序中集成 SQLite 数据库的读写功能。SQLite 是一个轻量级、开源的关系...

    Android数据库SQLite详解

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

    System.Data.SQLite.dll(sqlite_1.0.76.0.zip)

    System.Data.SQLite.dll是SQLite在.NET平台上的一个封装库,它为C#和其他.NET语言提供了对SQLite数据库引擎的全面支持。SQLite是一款轻量级、自包含的数据库系统,广泛应用于嵌入式系统和移动应用,因为它不需要单独...

    System.Data.SQLite.dll各版本

    System.Data.SQLite.dll是SQLite数据库引擎在.NET环境中的一个封装库,它使得.NET开发者可以方便地在应用程序中使用SQLite数据库。SQLite是一款开源、轻量级、自包含的SQL数据库引擎,适用于各种规模的应用程序,...

    Android实验报告Sqlite数据库操作.pdf

    Android SQLite 数据库操作报告 一、实验目的 Android 实验报告的主要目的是熟悉 Android 平台的文件操作、掌握 Android SQLite 数据库的设计和应用、熟悉 XML 和 JSON 文件的读取。通过本实验,用户可以掌握 ...

    AndroidSqlite数据库操作封装SQLiteUtils.zip

    一个简单的基于Android的Sqlite数据库的操作封装,它有如下的好处:便捷地创建表和增添表字段灵活的数据类型处理通过操作对象来insert或者update表记录支持多种查询方式,支持多表自定义的复杂查询,支持分页查询支持...

    Android 对sqlite的封装,实现CRUD

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

    System.Data.SQLite 1.0.112.rar

    System.Data.SQLite.EF6.dll是针对Entity Framework 6的扩展,Entity Framework是微软提供的一款ORM(对象关系映射)工具,它将.NET应用程序中的对象模型与数据库中的表和视图进行映射,使得开发者可以使用面向对象...

    android数据库开发_对象操作数据库 sqlite调试命令

    总结来说,Android应用开发中的SQLite数据库操作主要包括创建数据库和表、插入、查询、更新和删除数据。同时,掌握SQL命令和使用调试工具是确保数据库功能正常运行和优化的重要技能。DbDemo项目提供了一个实践平台,...

    Sqlite3 C++ 简单单例数据库操作类封装

    本文将深入探讨如何在C++中使用SQLite3进行单例模式的数据库操作类封装,以便更高效、安全地管理数据库。 首先,让我们了解什么是SQLite3。SQLite3是一个开源的、自包含的、无服务器的、事务性的SQL数据库引擎,...

    arcgis for android 读取加载sqlite数据库.rar

    在Android开发中,ArcGIS是一个强大的地理信息系统,它提供了丰富的地图和空间分析功能。而SQLite是一种轻量级的、开源的、嵌入式的关系型数据库,广泛应用于移动应用,包括Android。本教程将探讨如何在ArcGIS for ...

    System.Data.SQLite(32、64通用版本)

    System.Data.SQLite是一个开源的.NET Framework数据提供程序,它实现了SQLite数据库引擎与ADO.NET接口的集成。这个库使得.NET开发者能够方便地在SQLite数据库上进行数据操作,而无需依赖于特定平台或系统的数据库...

    64位System.Data.SQLite.dll

    System.Data.SQLite.dll是一个针对.NET Framework开发的SQLite数据库引擎的组件,专为64位操作系统设计。SQLite是一个轻量级、自包含的SQL数据库引擎,广泛应用于各种跨平台的应用程序中,因为它无需单独的服务器...

    Android-基于Android中原生SDK操作SQLite的封装

    为了提高开发效率,通常会使用ORM(Object-Relational Mapping)框架来简化数据库操作,将Java对象与SQLite数据库表进行映射,从而减少手动编写SQL语句的工作量。本文将详细介绍如何基于Android原生SDK封装SQLite...

    System.Data.SQLite-1.0.112

    System.Data.SQLite是一个开源的.NET框架数据提供程序,用于与SQLite数据库引擎进行交互。SQLite是一个轻量级、自包含的数据库,适用于嵌入式系统和移动应用程序。标题中的"System.Data.SQLite-1.0.112"指的是该库的...

    System.Data.SQLite打包下载

    在.NET环境中,开发人员可以使用Entity Framework、LINQ to SQL等ORM(对象关系映射)工具,结合System.Data.SQLite.dll进行更高级别的数据库操作,简化代码并提高开发效率。此外,System.Data.SQLite还支持SQLite的...

    delphi封装的sqlite3类

    其次,`SQLiteTable3.pas`是对SQLite数据库表操作的进一步封装,它提供了面向对象的接口,使得操作数据库表更加直观和便捷。这个单元通常包含类如TSQLiteTable3,它代表了一个数据库表,可以进行增删改查等操作。...

    System.Data.SQLite_32位、64位通用版本

    2. `System.Data.SQLite.dll`:这是.NET框架下的SQLite数据提供程序,包含了访问SQLite数据库所需的所有功能。 3. `SqliteTest(AnyCPU).exe`:这可能是一个可执行文件,使用了"AnyCPU"配置,意味着该程序能在任何...

Global site tag (gtag.js) - Google Analytics