OrmLite的封装

    使用ormlite数据库时,我们通常对每一张表都会写一个Dao类,里面会定义CRUD等操作的方法,如果只有一两张表的话,这样做也不算麻烦,但是有多张表的话,就需要写很多个Dao类,就显得比较重复了。所以我们最好把CRUD方法写到一个类里,使用泛型,这样就可以根据传递过来的实体类获取Dao对象,调用各种数据库操作。为此,对OrmLite的使用做了一些封装。
    代码目录,


DatabaseHelper
    使用ormlite都要继承OrmLiteSqliteOpenHelper,在子类中实现onCreate、onUpgrade等方法,

1、onCreate(SQLiteDatabase database,ConnectionSource connectionSource)

    创建表,使用createTable(ConnectionSource connectionSource, Class<T> dataClass)创建

2、onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion)

    更新表,可以在表中添加一个字段,也可以删除表,使用dropTable(ConnectionSource connectionSource, Class<T> dataClass, boolean ignoreErrors)删除,删除完成后,如果该表还需要使用,那么还需要创建,创建操作:onCreate(database, connectionSource)

3、在构造方法中定义数据库名和版本号

    // Database Name
    private static String DB_NAME = "ormlite.db";
    // Database Version
    private static final int DB_VERSION = 1;
    public DatabaseHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    public DatabaseHelper(Context context, String databaseName, SQLiteDatabase.CursorFactory factory, int databaseVersion) {
        super(context, databaseName, factory, databaseVersion);
        // TODO Auto-generated constructor stub
    }
4、创建实例

    使用单例公布出一个创建实例的方法,用于获取helper实例

    public static synchronized DatabaseHelper getDatabaseHelper(Context context) {
        if (instance == null) {
            synchronized (DatabaseHelper.class) {
                if (instance == null) {
                    instance = new DatabaseHelper(context);
                }
            }
        }
        return instance;
    }
BaseDao
    一个抽象类,实现了常用的数据库操作方法。
getDao(),抽象方法,在BaseDao的实现类中实现,获取实体类的Dao。
    /**
     * 插入一条记录
     *
     * @param t
     */
    public void insert(T t) {
        try {
            Dao<T, Integer> dao = getDao();
            dao.create(t);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    /**
     * 插入一组记录,使用事务处理
     *
     * @param list
     */
    public void insertList(List<T> list) {
        if (list.size() <= 0) return;
        try {
            Dao<T, Integer> dao = getDao();
            DatabaseConnection databaseConnection = null;
            try {
                databaseConnection = dao.startThreadConnection();
                dao.setAutoCommit(databaseConnection, false);
                for (T t : list) {
                    dao.create(t);
//                    dao.createIfNotExists(t);
                }
                dao.commit(databaseConnection);
            } catch (SQLException e) {
                dao.rollBack(databaseConnection);
                e.printStackTrace();
            } finally {
                dao.endThreadConnection(databaseConnection);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    插入一组记录,采用事务处理(处理list一般都采用事务处理,这样在数据很大时可明显提高效率)。需要注意create和createIfNotExists的区别:后者是当记录不存在时创建,存在的话就跳过;前者当记录存在时也不创建,并且如果这一组记录中有一条存在了,那么这组记录也不会创建。所以使用的时候需要注意,不过可以使用 insertOrUpdate 来代替。
    /**
     * 插入或更新一组数据,使用事务处理
     *
     * @param list
     */
    public void insertOrUpdate(List<T> list) {
        if (list.size() <= 0) return;
        try {
            Dao<T, Integer> dao = getDao();
            DatabaseConnection databaseConnection = null;
            try {
                databaseConnection = dao.startThreadConnection();
                dao.setAutoCommit(databaseConnection, false);
                for (T t : list) {
                    dao.createOrUpdate(t);
                }
                dao.commit(databaseConnection);
            } catch (SQLException e) {
                dao.rollBack(databaseConnection);
                e.printStackTrace();
            } finally {
                dao.endThreadConnection(databaseConnection);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    删除和查询方法也都做了多个重载,可满足大多数情况,就不对每一个方法详述了。

BaseDaoImpl
    BaseDao的实现类,实现了getDao方法,
    @Override
    public Dao<T, Integer> getDao() throws SQLException {
        // TODO Auto-generated method stub
        Dao<T, Integer> dao = mDaoMap.get(clazz);
        if (null == dao) {
            dao = mDatabaseHelper.getDao(clazz);
            mDaoMap.put(clazz, dao);
        }
        return dao;
    }
    根据实体类获取Dao对象,放到HashMap中,避免重复获取。
Helper
    一个帮助类,主要用来获取实体类的Dao对象,如,
    private BaseDao<Student, Integer> mStudentDao;
    public BaseDao<Student, Integer> getStudentDao() {
        if (mStudentDao == null) {
            mStudentDao = new BaseDaoImpl<>(mContext, Student.class);
        }
        return mStudentDao;
    }
Utils
    工具类,定义了数据库文件拷贝到SD卡的方法。

实例简析
1、实体类Student.java,定义了表名和字段
@DatabaseTable(tableName = "table_student")
public class Student {

    @DatabaseField(id = true, uniqueCombo = true, columnName = "id")
    public int id;// 学号
    @DatabaseField(columnName = "name", canBeNull = false)
    public String name;// 姓名
    @DatabaseField(columnName = "profession")
    public String profession;// 专业

    public Student() {

    }

    public Student(int id, String name, String profession) {
        this.id = id;
        this.name = name;
        this.profession = profession;
    }

}
2、创建表
@Override
public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
// TODO Auto-generated method stub
try {
        TableUtils.createTable(connectionSource, Student.class);
    } catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
    }
}

@Override
public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
try {
        TableUtils.dropTable(connectionSource, Student.class, true);
        onCreate(database, connectionSource);
    } catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
    }
}
3、数据库操作

    private void add() {
        if (isEmpty(etId) || isEmpty(etName) || isEmpty(etProfession)) {
            Toast.makeText(this, "数据不能为空", Toast.LENGTH_SHORT).show();
            return;
        }
        int id = Integer.parseInt(etId.getText().toString());
        String name = etName.getText().toString();
        String profession = etProfession.getText().toString();
        Student student = new Student(id, name, profession);
        Helper.getInstance().getStudentDao().insert(student);
        updateListView();
    }

    private void delete() {
        if (isEmpty(etId)) {
            Toast.makeText(this, "id不能为空", Toast.LENGTH_SHORT).show();
            return;
        }
        int id = Integer.parseInt(etId.getText().toString());
        Helper.getInstance().getStudentDao().delete("id", id);
        updateListView();
    }

    private void update() {
        if (isEmpty(etId)) {
            Toast.makeText(this, "id不能为空", Toast.LENGTH_SHORT).show();
            return;
        }
        int id = Integer.parseInt(etId.getText().toString());
        String name = etName.getText().toString();
        String profession = etProfession.getText().toString();
        Student student = new Student(id, name, profession);
        Helper.getInstance().getStudentDao().update(student);
        updateListView();
    }

    private void query() {
        if (isEmpty(etId)) {
            Toast.makeText(this, "id不能为空", Toast.LENGTH_SHORT).show();
            return;
        }
        int id = Integer.parseInt(etId.getText().toString());
        Student student = Helper.getInstance().getStudentDao().query(new String[]{"id"}, new Object[]{id});
        mList.clear();
        mList.add(student);
        mAdapter.notifyDataSetChanged();
    }

    private void updateListView() {
        List<Student> list = Helper.getInstance().getStudentDao().queryAll();
        mList.clear();
        mList.addAll(list);
        mAdapter.notifyDataSetChanged();
    }

    private boolean isEmpty(EditText et) {
        if (et == null || et.getText() == null || "".equals(et.getText().toString())) {
            return true;
        }
        return false;
    }
    对数据库操作仅需一行代码就行了。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值