在学习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开发中,依赖注入框架如Dagger或Hilt广泛使用,它们可以帮助管理对象的生命周期和依赖关系,提高代码可测试性。源码可能包含了相关的注解和配置。 七、权限管理 如果应用需要访问用户的财务数据,可能...
3. **ContentProvider**:虽然不是必须的,但为了与其他应用共享数据或遵守Android的数据访问规范,可以考虑使用ContentProvider封装数据库操作。ContentProvider为数据提供了统一的接口,使得其他应用可以通过URI来...
总结来说,“基于Android系统的日程管理应用-遨游天际”是一个全面的开发实例,涵盖了数据库操作、提醒机制、时间设置以及UI设计等多个核心技能点,对学习Android应用开发的人员具有很高的参考价值。通过深入研究和...
- SQLite数据库:本地数据存储的首选方式,我们可以创建一个`SQLiteOpenHelper`子类来管理日记表,包括创建表结构、插入、更新和删除操作。 - `ContentProvider`:虽然不是必需的,但为了与其他应用共享数据或者...
2. Android SDK:Java与Android SDK的结合,使得开发者能利用各种系统级别的API进行功能开发,如SQLite数据库用于存储用户数据,SharedPreferences用于轻量级的配置存储。 3. 对象封装:通过创建预算类、交易类等,...