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
- Android进阶之数据库框架ormlite使用
- Android项目使用ORMLite数据库框架 之 使用数据库配置文件
- Android使用OrmLite数据库框架 之 使用表配置文件
- Android使用OrmLite数据库框架 之 基本用法
- Android ORM数据库之OrmLite使用框架及源码分析
- android 数据库使用之OrmLite
- Android 数据库框架ormlite 使用精要
- Android 数据库框架ormlite 使用精要
- android 数据库操作使用ormlite框架1
- Android 数据库框架ormlite 使用精要
- 在android中使用OrmLite数据库框架
- android数据库框架ormlite的使用
- Android ORMLite数据库框架使用入门
- Android 数据库框架ormlite 使用精要
- Android 数据库框架ormlite 使用精要
- Android 数据库框架OrmLite的常规使用
- Android数据库ORMlite框架
- Android数据库ORMlite框架
- (数学)HDU 6043 KazaQ's Socks
- 【结构型模式】《大话设计模式》——读后感 (14)分公司=一部门?——组合模式
- 【JTS】利用JTS生成R树索引
- 【行为型模式】《大话设计模式》——读后感 (15)烤羊肉串引来的思考?——命令模式
- input的type=file触发的相关事件
- Android进阶之数据库框架ormlite使用
- WKWebView无法接受到JS调用原生方法的回调.
- 【行为型模式】《大话设计模式》——读后感 (16)加薪非要老板批?——职责链模式
- 2017 Multi-University Training Contest
- 利用python代码求质数
- Java泛型通配符
- spring中获取bean的两种方式
- 深度学习的入门方法
- C++基础之数组