Android进阶之数据库框架ormlite使用

来源:互联网 发布:strcontains php 编辑:程序博客网 时间:2024/06/09 15:24

1 ormlite是什么?

  官网www.ormlite.com,它的英文全称是Object Relational Mapping,意思是对象关系映射,在JavaEE开发就有一个类似的数据库映射框架——Hibernate。简单来说,就是我们定义一个实体类,利用这个框架,它可以帮我们把这个实体映射到我们的数据库中(SQLite),数据中的字段就是我们定义实体的成员变量。

2 为什么要用ormlite?

2.1 优点

(1)轻量级;
(2)使用简单,易上手;
(3)封装完善;
(4)文档全面。

2.2 缺点

(1)基于反射,效率较低;
(2)缺少中文翻译文档。

3 如何使用?

3.1 导入jar包到项目libs文件夹下(官网下载)

这里写图片描述

3.2 继承OrmLiteSqliteOpenHelper类定义数据库帮助类

3.2.1 源码

public class DatabaseHelper extends OrmLiteSqliteOpenHelper {    private static final String DATABASE_NAME = "fungovod.db";    private static final int DATABASE_VERSION = 1;    private Map<String, RuntimeExceptionDao> daos = new HashMap<>();    public DatabaseHelper (Context context) {        super(context, DATABASE_NAME, null, DATABASE_VERSION);    }    @Override    public void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) {        try {            TableUtils.createTable(connectionSource, Follows.class);        } catch (SQLException e) {            Logger.e(e);            throw new RuntimeException(e);        }    }    @Override    public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int i, int i1) {        try {            TableUtils.createTable(connectionSource, Follows.class);        } catch (SQLException e) {            Logger.e(e);            throw new RuntimeException(e);        }    }    private static DatabaseHelper instance;    /**     * 单例获取该Helper     *     * @param context     * @return     */    public static synchronized DatabaseHelper getHelper(Context context) {        context = context.getApplicationContext();        if (instance == null) {            synchronized (DatabaseHelper.class)            {                if (instance == null)                    instance = new DatabaseHelper(context);            }        }        return instance;    }    public synchronized RuntimeExceptionDao getRuntimeExceptionDao(Class clazz) {        RuntimeExceptionDao dao = null;        String className = clazz.getSimpleName();        if (daos.containsKey(className)) {            dao = daos.get(className);        }        if (dao == null) {            dao = super.getRuntimeExceptionDao(clazz);            daos.put(className, dao);        }        return dao;    }    /**     * 释放资源     */    @Override    public void close() {        super.close();        for (String key : daos.keySet()) {            RuntimeExceptionDao dao = daos.get(key);            dao = null;        }    }}

3.2.2 解释

(1)整个DatabaseHelper使用单例只对外公布出一个对象,保证app中只存在一个SQLite Connection , 参考文章:http://www.touchlab.co/2011/10/single-sqlite-connection/
(2)我们对每个Bean创建一个XXXDao来处理当前Bean的数据库操作,当然真正去和数据库打交道的对象,通过上面代码中的getDao(T t)进行获取getDao为一个泛型方法,会根据传入Class对象进行创建Dao,并且使用一个Map来保持所有的Dao对象,只有第一次调用时才会去调用底层的getDao()。

3.3 定义实体类Bean,代表一张表(持久层)

3.3.1 代码

@DatabaseTable(tableName = "tb_follows")  public class Follows {    @DatabaseField(id = true)    private String vid;    @DatabaseField    private String name;    @DatabaseField    private String img;    @DatabaseField    private long param1;    @DatabaseField    private long param2;    public Follows() {    }    public Follows(String vid, String name, String img) {        this.vid = vid;        this.name = name;        this.img = img;    }}
3.3.2 解释

@DatabaseTable:表示定义了一个数据表,如果不指定名字,在Android中会以类名作为表名,如packageInfo就是SQLite数据库中的表名,我们也可以指定表名,@DatabaseTable(tableName = “tb_package”) 。

DatabaseField:表示定义了数据中的一个字段,id表示数据中的一个主键,如果指定为generatedId,表示自动增长id,我们不需要给它赋值。其他字段,可以使用columnName来指定字段名,canBeNull表示是否为空,这些赋值可以按照以下来指定-(id = true, canBeNull = false)(columnName = “name”)

3.4 定义Bean的DAO,对数据库进行增、删、改、查(Dao层)

3.4.1 代码

public class FollowsDao {    private RuntimeExceptionDao<Follows, String> followsRuntimeDao = null;    private DatabaseHelper helper;    public FollowsDao(Context context) {        helper = DatabaseHelper.getHelper(context);        followsRuntimeDao = helper.getRuntimeExceptionDao(Follows.class);    }    public boolean addToFollows(Follows follows) {        Dao.CreateOrUpdateStatus status = followsRuntimeDao.createOrUpdate(follows);        return status.isCreated() || status.isUpdated();    }    public boolean checkFollows(String vid) {        return followsRuntimeDao.idExists(vid);    }    public boolean removeFollow(String vid) {        int i = followsRuntimeDao.deleteById(vid);        Logger.i("delete follow: "+vid + ", rs: " + i);        return i > 0;    }    public void removeFollows(List<String> ids) {        followsRuntimeDao.deleteIds(ids);    }    public List<Follows> getFollows(int page) {        return followsRuntimeDao.queryForAll();    }}

3.5 Service方法接口和实现类(业务层)

public class UserInfoService {    FollowsDao followsDao;    public UserInfoService(FollowsDao followsDao) {        this.followsDao = followsDao;    }    public boolean isFollowed(String vid) {        return followsDao.checkFollows(vid);    }    public boolean removeFollow(String vid) {        return followsDao.removeFollow(vid);    }    public boolean removeFollows(List<String> ids) {        return followsDao.removeFollows(ids);    }    public boolean saveFollows(VodInfo videoInfo) {        boolean saved = false;        if (videoInfo != null) {            String vid = videoInfo.getVid();            String img = videoInfo.getPic916();            String name = videoInfo.getTitle();            saved = saveFollow(vid, name, img);        }        return saved;    }    public boolean saveFollow(String vid, String name, String img) {        Follows f = new Follows(vid, name, img);        return followsDao.addToFollows(f);    }    public List<Follows> getFollowList() {        return followsDao.getFollows(0);    }}

3.6 测试(调用层)

private void removeAllRecords() {        List<String> ids = new ArrayList<>();        for (RecordBean bean : recordBeans) {             ids.add(bean.url);        }        recordInfoService.removeRecords(ids);// 删除全部        initData();// 重新更新数据,避免删除不干净,继续读取剩余数据        collectAdapter.notifyDataSetChanged();}             

4 参考链接

ormlite官方文档

Android 快速开发系列 ORMLite 框架最佳实践

Android 数据库框架ormlite 使用精要

http://blog.csdn.net/i_lovefish/article/details/17252525

阅读全文
0 0
原创粉丝点击