一个简单的数据库操作框架

开发Android的同学都知道sdk已经为我们提供了一个SQLiteOpenHelper类来创建和管理SQLite数据库,通过写一个子类去继承它,就可以方便的创建、管理数据库。但是当我们需要去做增删改查的操作的时候,就得通过getWritableDatabase获取一个SQLiteDataBase然后老老实实去写操作值的put以及查询返回的Cursor处理,其实我们可以搞一个对象来帮我们干这些事情,打造属于你自己的数据库操作类。

- 主要优点

1.自动跟据类名创建表,通过反射字段创建表的列数据
2.不用或少用SQL语句就能进行增删改查的功能

- DatabaseHelper继承SQLiteOpenHelper

public class DatabaseHelper extends SQLiteOpenHelper {


    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME ="Demo.db";
    private Class<?> mClass = null;

    public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);

    }

    public DatabaseHelper(Context context,String db_name,int db_version, Class<?> clazz) {
        this(context,db_name, null, db_version);
        this.mClass = clazz;
    }
    //创建表,根据类名创建表名
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(Utils.getCreateTableSql(mClass));
    }
    //更新表
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Utils.dropTablesByClasses(db,mClass);
        onCreate(db);
    }
}

- DatabaseUtil具体的增删该查工具类

public class DatabaseUtils {
    private DatabaseHelper mDatabaseHelper;
    private SQLiteDatabase db = null;
    private Context mContext;
    private String db_name;
    private  static  DatabaseUtils mUtils;
    /**
     *
     * @param context
     * @param db_name 数据库名字
     * @param db_version 数据库版本
     * @param clazz 类名(后面会作为创建表的名字)
     */
    private   DatabaseUtils(Context context,String db_name,int db_version, Class<?> clazz){
        this.mDatabaseHelper = new DatabaseHelper(context,db_name,db_version,clazz);
        this.mContext = context;
        this.db_name = db_name;
        db = mDatabaseHelper.getWritableDatabase();
    }

    //单例模式
    public static DatabaseUtils getInstance(Context context,String db_name,int db_version, Class<?> clazz){
        if(mUtils == null){
            mUtils = new DatabaseUtils(context,db_name,db_version,clazz);
        }
        return mUtils;
    }

    /**
     * 关闭数据库
     */
    public synchronized void closeDataBase() {

        db.close();
        mDatabaseHelper = null;
        db = null;
    }

    /**
     * 删除数据库
     *
     * @return 成功返回true,否则返回false
     */
    public synchronized boolean deleteDataBase() {
        return mContext.deleteDatabase(db_name);
    }

    /**
     * 插入一条数据
     *
     * @param obj
     * @return 返回-1代表插入数据库失败,否则成功
     * @throws IllegalAccessException
     */
    public synchronized long insert(Object obj) {
        Class<?> modeClass = obj.getClass();
        Field[] fields = modeClass.getDeclaredFields();
        ContentValues values = new ContentValues();

        for (Field fd : fields) {
            fd.setAccessible(true);
            String fieldName = fd.getName();
            //剔除主键id值得保存,由于框架默认设置id为主键自动增长
            if (fieldName.equalsIgnoreCase("id") || fieldName.equalsIgnoreCase("_id")) {
                continue;
            }
            putValues(values, fd, obj);
        }
        return db.insert(Utils.getTableName(modeClass), null, values);
    }


    /**
     * 查询数据库中所有的数据
     *
     * @param clazz
     * @param <T>   以 List的形式返回数据库中所有数据
     * @return 返回list集合
     * @throws IllegalAccessException
     * @throws InstantiationException
     * @throws NoSuchMethodException
     * @throws InvocationTargetException
     */
    public synchronized <T> List<T> findAll(Class<T> clazz) {
        Cursor cursor = db.query(clazz.getSimpleName(), null, null, null, null, null, null);
        return getEntity(cursor, clazz);
    }

    /**
     * 根据指定条件返回满足条件的记录
     *
     * @param clazz      类
     * @param select     条件语句 :("url=?")
     * @param selectArgs 条件(new String[]{url}) 查询id=0的记录
     * @param <T>        类型
     * @return 返回满足条件的list集合
     * //String sql = "select thread_id, start_pos, end_pos,compelete_size,url from download_info where url=?";
     */
    public synchronized <T> List<T> findByArgs(Class<T> clazz, String select, String[] selectArgs) {
        Cursor cursor = db.query(clazz.getSimpleName(), null, select, selectArgs, null, null, null);
        return getEntity(cursor, clazz);
    }


    /**
     * 通过id查找制定数据
     *
     * @param clazz 指定类
     * @param id    条件id
     * @param <T>   类型
     * @return 返回满足条件的对象
     */
    public synchronized <T> T findById(Class<T> clazz, int id) {
        Cursor cursor = db.query(clazz.getSimpleName(), null, "id=" + id, null, null, null, null);
        List<T> list = getEntity(cursor, clazz);
        return list.get(0);
    }

    /**
     * 删除记录一条记录
     *
     * @param clazz 需要删除的类名
     * @param id    需要删除的 id索引
     */
    public synchronized void deleteById(Class<?> clazz, long id) {
        db.delete(Utils.getTableName(clazz), "id=" + id, null);
    }

    /**
     * 删除数据库中指定的表
     *
     * @param clazz
     */
    public synchronized void deleteTable(Class<?> clazz) {
        db.execSQL("DROP TABLE IF EXISTS" + Utils.getTableName(clazz));
    }

    /**
     * 更新一条记录
     *
     * @param clazz  类
     * @param values 更新对象
     * @param id     更新id索引
     */
    public synchronized void updateById(Class<?> clazz, ContentValues values, long id) {
        db.update(clazz.getSimpleName(), values, "id=" + id, null);
    }

    /**
     *
     * @param clazz 类
     * @param values 更新的对象(compelete_size=?)
     * @param whereClause where语句(where url=? and thread_id=?)
     * @param whereArgs where语句的值
     *   String sql = "update download_info set compelete_size=? where thread_id=? and url=?";
     */
    public synchronized void updateByArgs(Class<?> clazz, ContentValues values,String whereClause, String[] whereArgs) {
        db.update(clazz.getSimpleName(), values,whereClause , whereArgs);
    }

- 如何使用

public void onClick(View v) {
        switch (v.getId()) {
            case R.id.insert:
                People people = new People();
                people.setDate("hahahhahha");
                people.setDevice_id(89757);
                people.setDevice_name("Android");
                people.setTime("2012.12.12");
                people.setUsername("乔布斯");
                mInstance.insert(people);
                break;
            case R.id.update:
                ContentValues values = new ContentValues();
                values.put("date","xixixxixixixixixi");
                mInstance.updateByArgs(People.class,values,"device_id=?",new String[]{"9577"} );
                break;
            case R.id.query:
                mInstance.findAll(People.class);
                break;
            case R.id.delete:
                mInstance.deleteByArgs(People.class,"username=?",new String[]{"乔布斯"});
                break;
        }
    }

demo下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值