最近因为项目需要,不能使用第三方的数据库工具了,比如 ormlite。所以自己写了一个工具类,可以完成基本的增删改查的通用SQlite工具,很长时间没有怎么研究过SQLite,写的不好的地方,请见谅,使用有什么问题可以留言,我尽能力解决,有建议也很欢迎提出。另外其中会用到LogUtil.("","");方法,这个是自己封装的一个log类,也会在下面贴出来,很简单。
一、SQLite操作类:
package com.sp.util.db;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Date;
import java.util.Map;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import com.sp.util.commonutils.LogUtil;
/**
* 数据库简易操作类,提供增删改查的方法,具体请查看注释 注意: 1、数据库各表的主键id字段为:_id;
* 2、数据库各表各列字段名为initEDB时传入的对象的类的成员变量名
* (仅支持成员变量的类型为int、long、float、double、boolean、string、date);
* 3、需存入数据库的数据所属的类必须有对应的自动生成的get\set方法; 4、请调用本类公开的方法,或根据需求添加方法,请不要删除或修改既有方法或参数;
* 5、调用:SQLiteEasyHelper.getInstance().initEDB(context,
* classes);,必须先调用initEDB创建需要的数据库和表
* ,然后可调用其它增删改查方法,调用方式相同:SQLiteEasyHelper.getInstance().~~~
*
* @author songyuan
*
*/
public class SQLiteEasyHelper {
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 数据库名称
<span style="white-space:pre"> </span> *
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>private String dbName = "";
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 数据库版本
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>private final static int DB_VERSION = 1;
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 表主键id字段
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>private final static String RECORD_ID = "_id";
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 数据库创建、更新工具对象
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>private static SQLiteOpenHelper sqLiteOpenHelper = null;
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 数据库表数据实际操作对象(增删改查)
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>private static SQLiteDatabase sqDB = null;
<span style="white-space:pre"> </span>private static SQLiteEasyHelper sqLiteEasyHelper = null;
<span style="white-space:pre"> </span>private SQLiteEasyHelper() {
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 初始化该简单数据库操作类
<span style="white-space:pre"> </span> *
<span style="white-space:pre"> </span> * @param context
<span style="white-space:pre"> </span> * @param cs
<span style="white-space:pre"> </span> * @return
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>public static SQLiteEasyHelper getInstance() {
<span style="white-space:pre"> </span>if (sqLiteEasyHelper == null) {
<span style="white-space:pre"> </span>sqLiteEasyHelper = new SQLiteEasyHelper();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>openDB();
<span style="white-space:pre"> </span>return sqLiteEasyHelper;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 实例化数据库创建、更新工具对象SQLiteOpenHelper,并预先创建各 表
<span style="white-space:pre"> </span> *
<span style="white-space:pre"> </span> * @param context
<span style="white-space:pre"> </span> * @param dbName
<span style="white-space:pre"> </span> * @param cs
<span style="white-space:pre"> </span> * class的集合,其中的每个class的成员变量的字段类型仅支持:int、long、float、double、boolean
<span style="white-space:pre"> </span> * 、string、date
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>public synchronized void initEDB(Context context, String dbName, final Class<?>[] cs) {
<span style="white-space:pre"> </span>if (sqLiteOpenHelper == null) {
<span style="white-space:pre"> </span>this.dbName = dbName;
<span style="white-space:pre"> </span>sqLiteOpenHelper = new SQLiteOpenHelper(context, dbName, null, DB_VERSION) {
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public void onCreate(SQLiteDatabase db) {
<span style="white-space:pre"> </span>// 仅当该应用第一次执行 new SQLiteOpenHelper(...)时,执行onCreate
<span style="white-space:pre"> </span>// 统计需要创建的表的数据(表名、字段名、字段类型)
<span style="white-space:pre"> </span>ArrayList<String> tableNamesList = new ArrayList<String>();
<span style="white-space:pre"> </span>for (int i = 0; i < cs.length; i++) {
<span style="white-space:pre"> </span>Class<?> c = cs[i];
<span style="white-space:pre"> </span>String cName = subLastPointString(c.getName().toLowerCase());
<span style="white-space:pre"> </span>String tableName = "t_" + cName;
<span style="white-space:pre"> </span>tableNamesList.add(tableName);
<span style="white-space:pre"> </span>Field[] fs = c.getDeclaredFields();
<span style="white-space:pre"> </span>// sql语句
<span style="white-space:pre"> </span>String sql = "create table if not exists " + tableNamesList.get(i) + " (" + RECORD_ID + " integer primary key autoincrement, ";
<span style="white-space:pre"> </span>for (int j = 0; j < fs.length; j++) {
<span style="white-space:pre"> </span>Field f = fs[j];
<span style="white-space:pre"> </span>String fNameLower = subLastPointString(f.getName().toLowerCase());
<span style="white-space:pre"> </span>if (isSerialVersionUID(fNameLower)) {
<span style="white-space:pre"> </span>continue;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>String fType = subLastPointString(f.getType().getName().toLowerCase());
<span style="white-space:pre"> </span>if (!isInvalidFeildType(fType)) {
<span style="white-space:pre"> </span>// sql语句
<span style="white-space:pre"> </span>sql = sql + fNameLower + " " + matchFeildType(fType) + ",";
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>sql = sql.substring(0, sql.length() - 1) + ");";
<span style="white-space:pre"> </span>LogUtil.log("SQLiteEasyHelper onCreate create table", "[sql]" + sql);
<span style="white-space:pre"> </span>// 创建各表
<span style="white-space:pre"> </span>db.execSQL(sql);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>};
<span style="white-space:pre"> </span>openDB();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 插入一条数据
<span style="white-space:pre"> </span> *
<span style="white-space:pre"> </span> * @param obj
<span style="white-space:pre"> </span> * 该条数据的实例
<span style="white-space:pre"> </span> * @throws InvocationTarget