在学习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层中,方便管理。
分享到:
相关推荐
gcc使用的sqlite3数据库,sqlite3.a ,可以用于Dev-C++,也可以用于Windows下使用gcc编译的程序,sqlite版本是:3270200,还包含了sqlite3.lib库文件,可以用于visual studio。
Android源码——数据库SQLite.zip
Android 数据库SQLite 详解,简单学好SQLite
System.Data.SQLite.DLL C# 读写sqlite数据库 亲测可用 不能读取加密的sqlite数据库
介绍node-sqlite3 API,并对API初步封装,方便开发人员调用,实现业务逻辑。
.net sqlite_1.0.76.0里面包括: System.Data.SQLite.dll System.Data.SQLite.dll类库文档 sqlite-doc-3070800文档
在开发过程中,特别是移动类的开发,经常会把数据存储到本地上,这时就需要用到Sqlite小型数据库,那么程序上就需要引用这两个类SQLite.Interop.089.dll跟System.Data.SQLite.dll
基于Android中原生SDK操作SQLite的封装,大大简化了实体对象与本地数据库间的交互操作,提升App的开发效率
sqlite3.h sqlite3头文件~~~~~~~
QLite操作驱动的dll。下载完成后,新建一个winform项目,在引用中添加[System.Data.SQLite.dll],并在[Form.cs]中添加[using System.Data.SQLite;]
Android快速SDK(3)数据库Sqlite
[1] SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。...
android的连接数据库SQLite3
封装接口: 1.生成数据库文件 2.打开数据库 3.关闭数据库 4.执行Sql语句 5.增删改查的实现及重载接口 6.事务操作:taransction和commit QT版本:QT5.14.2
大家好,个人觉得用Sqlite数据库时,经常需要进行机械性的CRUD操作,故对其进行了一下封装,希望能起到抛砖引玉的作用。 目的:封装共有的CRUD 下面简单的说一下使用步骤,如果觉得多余,可以无视。 1. 实现自己...
android数据库SQLite学习笔记.pdf
Android实验报告Sqlite数据库操作.pdf
安卓Android源码——数据库SQLite.zip
android应用,将外部的sqlite数据库导入到应用的私有空间中,源db文件置于assets目录下,如果源文件大小超过1M,使用Filesplit分割为不超过1M的小文件,那么就将所有分小文件置于assets目录下,本工程里已带...
linux下c语言操作sqlite3数据库,有sqlite3动态库、sqlite3的源码安装包、c语言操作sqlite3数据库的封装函数。保证C语言能够正常对sqlite3进行增、删、改、查操作。已经在多个项目上使用,绝对可行。