在学习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数据库的源码分析、使用示例以及相关的图像资源,如1-120912223R80-L.png,可能用于解释或展示SQLite在Android中的工作原理。...
本篇文章将深入探讨如何使用`node-sqlite3`库来操作SQLite3数据库,并对其进行封装,以便于在实际项目中更高效地使用。 首先,`node-sqlite3`是Node.js的一个数据库驱动,它提供了与SQLite3数据库交互的接口。安装...
System.Data.SQLite.DLL 是一个用于 .NET Framework 的 SQLite 数据库引擎的 ADO.NET 提供程序。这个库使得 C# 开发者能够方便地在他们的应用程序中集成 SQLite 数据库的读写功能。SQLite 是一个轻量级、开源的关系...
在Android开发中,SQLite是一个非常重要的组成部分,它是一个轻量级的、开源的、嵌入式的SQL数据库引擎,被广泛用于存储和管理应用程序中的数据。SQLite具有高效、可靠且易于集成的特点,使得它成为Android应用数据...
System.Data.SQLite.dll是SQLite在.NET平台上的一个封装库,它为C#和其他.NET语言提供了对SQLite数据库引擎的全面支持。SQLite是一款轻量级、自包含的数据库系统,广泛应用于嵌入式系统和移动应用,因为它不需要单独...
System.Data.SQLite.dll是SQLite数据库引擎在.NET环境中的一个封装库,它使得.NET开发者可以方便地在应用程序中使用SQLite数据库。SQLite是一款开源、轻量级、自包含的SQL数据库引擎,适用于各种规模的应用程序,...
Android SQLite 数据库操作报告 一、实验目的 Android 实验报告的主要目的是熟悉 Android 平台的文件操作、掌握 Android SQLite 数据库的设计和应用、熟悉 XML 和 JSON 文件的读取。通过本实验,用户可以掌握 ...
一个简单的基于Android的Sqlite数据库的操作封装,它有如下的好处:便捷地创建表和增添表字段灵活的数据类型处理通过操作对象来insert或者update表记录支持多种查询方式,支持多表自定义的复杂查询,支持分页查询支持...
大家好,个人觉得用Sqlite数据库时,经常需要进行机械性的CRUD操作,故对其进行了一下封装,希望能起到抛砖引玉的作用。 目的:封装共有的CRUD 下面简单的说一下使用步骤,如果觉得多余,可以无视。 1. 实现自己...
System.Data.SQLite.EF6.dll是针对Entity Framework 6的扩展,Entity Framework是微软提供的一款ORM(对象关系映射)工具,它将.NET应用程序中的对象模型与数据库中的表和视图进行映射,使得开发者可以使用面向对象...
总结来说,Android应用开发中的SQLite数据库操作主要包括创建数据库和表、插入、查询、更新和删除数据。同时,掌握SQL命令和使用调试工具是确保数据库功能正常运行和优化的重要技能。DbDemo项目提供了一个实践平台,...
本文将深入探讨如何在C++中使用SQLite3进行单例模式的数据库操作类封装,以便更高效、安全地管理数据库。 首先,让我们了解什么是SQLite3。SQLite3是一个开源的、自包含的、无服务器的、事务性的SQL数据库引擎,...
在Android开发中,ArcGIS是一个强大的地理信息系统,它提供了丰富的地图和空间分析功能。而SQLite是一种轻量级的、开源的、嵌入式的关系型数据库,广泛应用于移动应用,包括Android。本教程将探讨如何在ArcGIS for ...
System.Data.SQLite是一个开源的.NET Framework数据提供程序,它实现了SQLite数据库引擎与ADO.NET接口的集成。这个库使得.NET开发者能够方便地在SQLite数据库上进行数据操作,而无需依赖于特定平台或系统的数据库...
System.Data.SQLite.dll是一个针对.NET Framework开发的SQLite数据库引擎的组件,专为64位操作系统设计。SQLite是一个轻量级、自包含的SQL数据库引擎,广泛应用于各种跨平台的应用程序中,因为它无需单独的服务器...
为了提高开发效率,通常会使用ORM(Object-Relational Mapping)框架来简化数据库操作,将Java对象与SQLite数据库表进行映射,从而减少手动编写SQL语句的工作量。本文将详细介绍如何基于Android原生SDK封装SQLite...
System.Data.SQLite是一个开源的.NET框架数据提供程序,用于与SQLite数据库引擎进行交互。SQLite是一个轻量级、自包含的数据库,适用于嵌入式系统和移动应用程序。标题中的"System.Data.SQLite-1.0.112"指的是该库的...
在.NET环境中,开发人员可以使用Entity Framework、LINQ to SQL等ORM(对象关系映射)工具,结合System.Data.SQLite.dll进行更高级别的数据库操作,简化代码并提高开发效率。此外,System.Data.SQLite还支持SQLite的...
其次,`SQLiteTable3.pas`是对SQLite数据库表操作的进一步封装,它提供了面向对象的接口,使得操作数据库表更加直观和便捷。这个单元通常包含类如TSQLiteTable3,它代表了一个数据库表,可以进行增删改查等操作。...
2. `System.Data.SQLite.dll`:这是.NET框架下的SQLite数据提供程序,包含了访问SQLite数据库所需的所有功能。 3. `SqliteTest(AnyCPU).exe`:这可能是一个可执行文件,使用了"AnyCPU"配置,意味着该程序能在任何...