ORMLite的集成和使用
Android中最常用的数据库框架有ORMLite和GreenDao,ORMLite相比GreenDao来说更加轻量,并且学习成本也较低。由于ORMLite是基于反射机制工作的,所以相比GreenDao来说效率较低。
在module的build.gradle中添加依赖:
compile 'com.j256.ormlite:ormlite-android:5.0'compile 'com.j256.ormlite:ormlite-core:5.0'
创建数据库
创建数据库需要借助一个类似原生SQLite数据库的DatabaseHelper的类,ORMLite要求我们必须继承OrmLiteSqliteOpenHelper,代码如下:
/*** 数据库操作管理工具类* <p>* 我们需要自定义一个类继承自ORMlite给我们提供的OrmLiteSqliteOpenHelper,创建一个构造方法,重写两个方法onCreate()和onUpgrade()* 在onCreate()方法中使用TableUtils类中的createTable()方法初始化数据表* 在onUpgrade()方法中我们可以先删除所有表,然后调用onCreate()方法中的代码重新创建表* <p>* 我们需要对这个类进行单例,保证整个APP中只有一个SQLite Connection对象* <p>* 这个类通过一个Map集合来管理APP中所有的DAO,只有当第一次调用这个DAO类时才会创建这个对象(并存入Map集合中)* 其他时候都是直接根据实体类的路径从Map集合中取出DAO对象直接调用*/
public class DataOpenHelper extends OrmLiteSqliteOpenHelper {// 数据库名称public static final String DATABASE_NAME = "mydb.db";// 本类的单例实例private static DataOpenHelper instance;// 存储APP中所有的DAO对象的Map集合private Map<String, Dao> daos = new HashMap<>();// 获取本类单例对象的方法public static synchronized DataOpenHelper getInstance(Context context) {if (instance == null) {synchronized (DataOpenHelper.class) {if (instance == null) {instance = new DataOpenHelper(context);}}}return instance;}// 私有的构造方法private DataOpenHelper(Context context) {super(context, DATABASE_NAME, null, 1);}// 根据传入的DAO的路径获取到这个DAO的单例对象(要么从daos这个Map中获取,要么新创建一个并存入daos)public synchronized Dao getDao(Class clazz) throws SQLException {Dao dao = null;String className = clazz.getSimpleName();if (daos.containsKey(className)) {dao = daos.get(className);}if (dao == null) {dao = super.getDao(clazz);daos.put(className, dao);}return dao;}@Override // 创建数据库时调用的方法public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {try {TableUtils.createTable(connectionSource, UserBean.class);TableUtils.createTable(connectionSource, ArticleBean.class);} catch (SQLException e) {e.printStackTrace();}}@Override // 数据库版本更新时调用的方法public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {try {TableUtils.dropTable(connectionSource, UserBean.class, true);TableUtils.dropTable(connectionSource, ArticleBean.class, true);onCreate(database, connectionSource);} catch (SQLException e) {e.printStackTrace();}}// 释放资源@Overridepublic void close() {super.close();for (String key : daos.keySet()) {Dao dao = daos.get(key);dao = null;}}
}
创建数据实体类:
/*** UserBean实体类,存储数据库中user表中的数据* <p>* 注解:* DatabaseTable:通过其中的tableName属性指定数据库名称* DatabaseField:代表数据表中的一个字段* ForeignCollectionField:一对多关联,表示一个UserBean关联着多个ArticleBean(必须使用ForeignCollection集合)* <p>* 属性:* id:当前字段是不是id字段(一个实体类中只能设置一个id字段)* columnName:表示当前属性在表中代表哪个字段* generatedId:设置属性值在数据表中的数据是否自增* useGetSet:是否使用Getter/Setter方法来访问这个字段* canBeNull:字段是否可以为空,默认值是true* unique:是否唯一* defaultValue:设置这个字段的默认值*/
@DatabaseTable(tableName = "user") // 指定数据表的名称
public class UserBean {// 定义字段在数据库中的字段名public static final String COLUMNNAME_ID = "id";public static final String COLUMNNAME_NAME = "name";public static final String COLUMNNAME_SEX = "sex";public static final String COLUMNNAME_BIRTHDAY = "birthday";public static final String COLUMNNAME_ADDRESS = "address";@DatabaseField(generatedId = true, columnName = COLUMNNAME_ID, useGetSet = true)private int id;@DatabaseField(columnName = COLUMNNAME_NAME, useGetSet = true, canBeNull = false, unique = true)private String name;@DatabaseField(columnName = COLUMNNAME_SEX, useGetSet = true, defaultValue = "1")private char sex;@DatabaseField(columnName = COLUMNNAME_BIRTHDAY, useGetSet = true)private Date birthday;@DatabaseField(columnName = COLUMNNAME_ADDRESS, useGetSet = true)private String address;@ForeignCollectionField(eager = true)private ForeignCollection<ArticleBean> articles;public UserBean() {}public UserBean(String name, char sex, Date birthday, String address) {this.name = name;this.sex = sex;this.birthday = birthday;this.address = address;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public char getSex() {return sex;}public void setSex(char sex) {this.sex = sex;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public ForeignCollection<ArticleBean> getArticles() {return articles;}public void setArticles(ForeignCollection<ArticleBean> articles) {this.articles = articles;}@Overridepublic String toString() {return "UserBean{" +"id=" + id +", name='" + name + '\'' +", sex=" + sex +", birthday=" + birthday +", address='" + address + '\'' +", articles=" + articles +'}';}
}
创建UserDao
/*** 操作User数据表的Dao类,封装这操作User表的所有操作* 通过DataOpenHelper类中的方法获取ORMLite内置的DAO类进行数据库中数据的操作* <p>* 调用dao的create()方法向表中添加数据* 调用dao的delete()方法删除表中的数据* 调用dao的update()方法修改表中的数据* 调用dao的queryForAll()方法查询表中的所有数据*/
public class UserDao {private Context context;// ORMLite提供的DAO类对象,第一个泛型是要操作的数据表映射成的实体类;第二个泛型是这个实体类中ID的数据类型private Dao<UserBean, Integer> dao;public UserDao(Context context) {this.context = context;try {this.dao = DataOpenHelper.getInstance(context).getDao(UserBean.class);} catch (SQLException e) {e.printStackTrace();}}// 向user表中添加一条数据public void insert(UserBean data) {try {dao.create(data);} catch (SQLException e) {e.printStackTrace();}}// 删除user表中的一条数据public void delete(UserBean data) {try {dao.delete(data);} catch (SQLException e) {e.printStackTrace();}}// 修改user表中的一条数据public void update(UserBean data) {try {dao.update(data);} catch (SQLException e) {e.printStackTrace();}}// 查询user表中的所有数据public List<UserBean> selectAll() {List<UserBean> users = null;try {users = dao.queryForAll();} catch (SQLException e) {e.printStackTrace();}return users;}// 根据ID取出用户信息public UserBean queryById(int id) {UserBean user = null;try {user = dao.queryForId(id);} catch (SQLException e) {e.printStackTrace();}return user;}
}
常用注解及其参数含义
@DatabaseTable(tableName = “user”),此处指创建了一个名为user的表;
@DatabaseField(columnName = “id”, generatedId = true),此处指创建了名为id的字段名,且是主键;
@DatabaseField(columnName = “name”),此处指创建了名为name的字段名;
id:当前字段是不是id字段(一个实体类中只能设置一个id字段)
columnName:表示当前属性在表中代表哪个字段
generatedId:设置属性值在数据表中的数据是否自增
useGetSet:是否使用Getter/Setter方法来访问这个字段
canBeNull:字段是否可以为空,默认值是true
unique:是否唯一
defaultValue:设置这个字段的默认值
foreignColumnName:外键约束指向的类中的属性名
foreign:当前字段是否是外键
foreignAutoRefresh:如果这个属性设置为true,在关联查询的时候就不需要再调用refresh()方法了
ORMLite的集成和使用相关推荐
- Android找工作系列之数据安全-ORMLite整合SQLCipher
Android数据库加密,目前就是SQLCipher对SQLite整体加密,微信也是使用这种方式.开源,且支持很多平台. SQLCipher虽说开源了,但是编译好的jar和so文件,还是要收费的. 但 ...
- ORMLite整合SQLCipher
Android数据库加密,目前就是SQLCipher对SQLite整体加密,微信也是使用这种方式.开源,且支持很多平台. SQLCipher虽说开源了,但是编译好的jar和so文件,还是要收费的. 但 ...
- Android数据库框架-----ORMLite 的基本用法
ORMLite 是一款非要流行的Android平台上的数据库框架,性能优秀,代码简洁: 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完善:4.文档全面. 缺点:1.基于反射,效率较低(本 ...
- Android项目快速开发框架探索(Mysql + OrmLite + Hessian + Sqlite)
前言 结合之前所用的ormlite和hessian,再加上SAE已经支持JAVA,把服务端切换到JAVA,也就有了本文.使用hessian来做数据传输,ormlite来实现客户端与服务端的数据存储,极 ...
- 安卓本地轻量级数据库操作框架 greenDao3.2.2 详细教程附带Demo①——集成环境,开辟难题。
欢迎安卓本地轻量级数据库操作框架 greenDao3.2.2 学习之旅. 本套框架博客系列博客目录: 第一篇:认识 greenDao3.2.2 框架,集成环境,开辟难题. 第二篇:简单的进行 增.删. ...
- Nignx集成fastDFS后访问Nginx一直在加载中解决
问题描述: Nginx集成fastDFS后,访问Nginx一直在加载中,得不到页面.查看Nginx的错误日志: 可以看到是fastdfs.conf的配置错误,tracker的ip没有修改: fastd ...
- Hexo集成Algolia实现搜索功能
2年前搭建的hexo博客好久没有维护了,一看 hexo 以及先前使用 butterfly 主题已经更新好几个版本了,看介绍在速度性能上有了很大的提高,于是打算给 hexo 升个级,整理整理翻翻新.通过 ...
- 将TVM集成到PyTorch
将TVM集成到PyTorch 随着TVM不断展示出对深度学习执行效率的改进,很明显PyTorch将从直接利用编译器堆栈中受益.PyTorch的主要宗旨是提供无缝且强大的集成,而这不会妨碍用户.PyTo ...
- 将TVM集成到PyTorch上
将TVM集成到PyTorch上 随着TVM不断展示出对深度学习执行效率的改进,很明显PyTorch将从直接利用编译器堆栈中受益.PyTorch的主要宗旨是提供无缝且强大的集成,而这不会妨碍用户.为此, ...
最新文章
- MySQL自带工具使用介绍
- Python descriptor
- centos7安装Oracle12(完整版)
- java enumerator_简单介绍java Enumeration
- TikTok广告投放指南(基础入门)
- 内核功能导致重启_诊断修复 TiDB Operator 在 K8s 测试中遇到的 Linux 内核问题
- 【转】ABAP BASE64编码与解码练习
- Redis如何淘汰过期的keys
- c语言清空输入缓冲区函数,c语言:C语言清空输入缓冲区在标准输入(stdin)情况 -电脑资料...
- ppc linux 性能,用profile和oprofile监视视linux性能!
- php oauth2 和 jwt,jwt-auth: thinkphp 的 jwt (JSON Web Token)身份验证扩展包,支持Swoole...
- android7.x版本编译framework.jar无效解决
- 你真的会用Context么?
- SpringClould之应用层鉴权Oauth2
- 软件测试书单/书籍推荐(整理更新中)
- 玩转SpringCloud(F版本) 四.路由网关(zuul)
- html+css制作月亮
- 【微信公众号】怎么办理信息系统安全等级保护备案证明?
- 3D MAX界面操作教程及渲染技巧
- 官宣,Google DeepMind 成立
热门文章
- 高分辨率遥感卫星影像在交通方面的应用及高分二号影像获取
- 关于树莓派魔镜应用的一点记录
- 金蝶eas税率更新为16%相关功能点
- python樱花手绘_宫崎骏动画里的新垣结衣见过没?这个开源动漫生成器让你的照片秒变手绘日漫...
- 人教版初中信息技术电子课本_电子课本|2020秋 部编人教版初中化学九年级上册教材电子课本(高清更新可打印)...
- 常用分词算法总结(字典、统计、神经网络)
- 《精解Windows8》——2.12 个性化Metro界面
- Tomcat安装与使用
- 手把手教你开发galgame 游戏(galgame 游戏引擎开发入门经典教程)
- webmatrix(WebMatrix升级)