Sqlite 反射机制封装数据库

这个博客详细介绍了如何在Android中利用反射和注解机制来封装SQLite数据库操作,包括插入、更新、删除和查询数据的方法,以及如何处理数据冲突。通过创建SqliteDAO类,实现了对数据库实体对象的便捷操作。
摘要由CSDN通过智能技术生成
public class SqliteDAO{
    static final String tag="DAO";

    /**
     * 访问的数据库
     */
    private SQLiteDatabase db;

    /**
     * 数据库打开辅助类
     */
    private static PADoctorSQLiteHelper paDoctorSQLiteHelper;
    private static long curUserId;

    /**
     * 数据插入冲突处理方式:
     * 0-忽略
     * 1-抛出异常
     * 2-替换数据
     */
    private int conflictType = 2;

    public SqliteDAO(Context c, long userId){
        if (paDoctorSQLiteHelper == null || userId != curUserId) {
            curUserId = userId;
            String prefix = "";
            try {
                prefix = c.getExternalFilesDir(null).getAbsolutePath() + "/";
            } catch (Exception e) {
                prefix = "";
            }
            paDoctorSQLiteHelper = new PADoctorSQLiteHelper(c, prefix+"u"+curUserId+".msg", null, 1);
        }
        db = paDoctorSQLiteHelper.getWritableDatabase();
    }

    public void close() {
        //db.close();
    }

    public SQLiteDatabase getSQLiteDatabase(){
        return db;
    }

    /**
     * 插入对象到数据库, 存储对象的所有字段到数据库的对应字段,包括NULL字段.
     * @param entity  待插入的对象
     * @return 如果插入数据库成功则返回该对象,否则返回NULL
     */
    public <T> T insert(T entity){
        return insert(entity,false);
    }

    /**
     * 插入对象到数据库, 仅存储对象的非空字段到数据库,对象的NULL字段将被忽略.
     * @param entity 待插入的对象
     * @return 如果插入数据库成功则返回该对象,否则返回NULL
     */
    public <T> T insertSelective(T entity){
        return insert(entity,true);
    }

    private <T> T insert(T entity,boolean selective){
        ContentValues values=getContentValues(entity,selective);

//        T exist_obj=this.loadByPrimaryKey(entity);
//        if(exist_obj!=null){
//            return exist_obj;
//        }

        long r;
        if(conflictType == 2){
            r = db.replace(getTableName(entity), null, values);
        }else{
            r = db.insert(getTableName(entity), null, values);
        }

        if(r >= 0){
            return entity;
        }

        return null;
    }

    /**
     * 根据主键删除数据
     * @param entity 待删除的对象, 主键只必须设置.
     * @return
     */
    public <T> int delete(T entity){
        Object[] args=getPrimarySelectionAndArgs(entity);
        return db.delete(getTableName(entity), (String)args[0], (String[])args[1]);
    }

    /**
     *
     * @param entity
     * @param whereClause
     * @param whereArgs
     * @return the number of rows affected if a whereClause is passed in, 0 otherwise.
     * To remove all rows and get a count pass "1" as the whereClause.
     */
    public <T> int deleteByWhereClause(T entity, String whereClause, String[] where
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值