OrmLite是一个数据库操作辅助的开源框架,底层还是Sqlite。O-R-M是Object relational mapping(对象关系映射)的缩写,即业务实体对象与关系型数据库之间的映射。对象中的属性与数据库表中的字段一一对应。OrmLite直接操作业务对象,隐藏了数据库操作的细节,使我们不用通过sql语句与数据库打交道。OrmLite通过Java注解的方式与数据库建立映射关系。
下面具体看实现(能够正常的对数据库进行增删改查):
一、首先,创建我们的业务实体对象,就是我们所说的model类,并通过注解的方式与数据库联系起来:
1.@DatabaseTable用来声明把此类作为数据库的表,可以在后面的括号中填入表名(不填的话就以类名作为表名)
2.@DatabaseField(columnName=”“)用来声明表的字段名,可以在后面的括号中设置字段的属性
@DatabaseTable //可以通过(tableName = "user")来改变表名
public class Student {
@DatabaseField //只有添加这个注释,才能把此属性添加到表中的字段
private String name;
@DatabaseField(generatedId = true) //generatedId = true 表示自增长的主键
private int id;
@DatabaseField
private String className;
@DatabaseField
private int userId;
@DatabaseField
private String sex;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", id=" + id +
", className='" + className + '\'' +
", userId=" + userId +
", sex='" + sex + '\'' +
'}';
}
}
二、创建数据库
与Android中的数据库创建类似,使用OrmLite创建数据库需要我们创建一个OrmHelper继承OrmLiteSqliteOpenHelper,OrmLiteSqliteOpenHelper也有两个方法需要我们去实现,分别是onCreate和onUpgrade,负责数据库创建以及升级时的操作。
public class OrmHelper extends OrmLiteSqliteOpenHelper {
public static final String DB_NAME ="dbName.db";
public static final int DB_VERSION = 1;
public OrmHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
//建表,和Gson类似,第二个参数即是业务实体类
try {
TableUtils.createTable(connectionSource,Student.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
//区分不同的版本做不同的更新
}
}
三、操作数据库
创建数据库之后就可以对数据库操作了,数据库的操作主要就是增删查改。OrmLite操作数据库的类是Dao,Dao相当于原生的SQLiteDatabase,一个Dao只能操作一张表。
1,插入操作
这些方法使用起来都比较简单,我们只需将自己的Bean传入到下列方法中即可
create:插入一条数据createIfNotExists:如果不存在则插入createOrUpdate:如果存在则更新
2,查询数据
OrmLite为我提供了一系列的查询操作,方法很多,而且很多都是只看方法名就可以知道的,在这里介绍一下如何使用QueryBuilder进行复杂查找。
首先调用personDao.queryBuilder();获得该Dao下的QueryBuilder对象,接下来设置QueryBuilder的查询条件,最后通过QueryBuilder的query方法获得List对象
3,删除和修改数据
与查询操作类似,ORMLite同样为我们提供了一系列的方法,同时也提供了复杂删除,复杂更改的DeleteBuilder和UpdateBuilder,其用法与QueryBuilder相似。
四、ORMLite外键引用
现在我们有两张表一张User,一张Article,Article中当然需要存储User的主键,作为关联~~那么在ORMLite中如何做到呢?
可能有人会直接在Article中声明一个int类型userId属性,当作普通属性处理搞定,这种做法并没有做,但是没有体现出面向对象的思想。
面向对象是这样的:Article属于某个User
类这么定义:
@DatabaseTable(tableName = "tb_article")
public class Article{
@DatabaseField(generatedId = true)
private int id;
@DatabaseField
private String title;
@DatabaseField(canBeNull = true, foreign = true, columnName = "user_id")
private User user;
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getTitle()
{
return title;
}
public void setTitle(String title)
{
this.title = title;
}
public User getUser()
{
return user;
}
public void setUser(User user)
{
this.user = user;
}
@Override
public String toString()
{
return "Article [id=" + id + ", title=" + title + ", user=" + user
+ "]";
}
}
不会去定义一个int类型的userId,而是直接定义一个User成员变量,表示本Article属于该User;
然后在User user属性上添加:@DatabaseField(canBeNull = true, foreign = true, columnName = "user_id")
canBeNull -表示不能为null;foreign=true表示是一个外键;columnName 列名
User类暂且就两个属性:
@DatabaseTable(tableName = "tb_user")
public class User {
@DatabaseField(generatedId = true)
private int id;
@DatabaseField(columnName = "name")
private String name;
public User()
{
}
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;
}
@Override
public String toString()
{
return "User [id=" + id + ", name=" + name
+ "]";
}
}
看我们的ArticleDao,
public class ArticleDao
{
private Dao articleDaoOpe;
private DatabaseHelper helper;
@SuppressWarnings("unchecked")
public ArticleDao(Context context){
try
{
helper = DatabaseHelper.getHelper(context);
articleDaoOpe = helper.getDao(Article.class);
} catch (SQLException e)
{
e.printStackTrace();
}
}
/**
* 添加一个Article
* @param article
*/
public void add(Article article){
try
{
articleDaoOpe.create(article);
} catch (SQLException e)
{
e.printStackTrace();
}
}
/**
* 通过Id得到一个Article
* @param id
* @return
*/
@SuppressWarnings("unchecked")
public Article getArticleWithUser(int id){
Article article = null;
try
{
article = articleDaoOpe.queryForId(id);
helper.getDao(User.class).refresh(article.getUser());
} catch (SQLException e)
{
e.printStackTrace();
}
return article;
}
/**
* 通过Id得到一篇文章
* @param id
* @return
*/
public Article get(int id){
Article article = null;
try
{
article = articleDaoOpe.queryForId(id);
} catch (SQLException e)
{
e.printStackTrace();
}
return article;
}
/**
* 通过UserId获取所有的文章
* @param userId
* @return
*/
public List listByUserId(int userId){
try
{
return articleDaoOpe.queryBuilder().where().eq("user_id", userId)
.query();
} catch (SQLException e)
{
e.printStackTrace();
}
return null;
}
}
写我们的测试类:
public class OrmLiteDbTest{
public void testAddArticle(){
User u = new User();
u.setName("张鸿洋");
new UserDao(getContext()).add(u);
Article article = new Article();
article.setTitle("ORMLite的使用");
article.setUser(u);
new ArticleDao(getContext()).add(article);
}
public void testGetArticleById(){
Article article = new ArticleDao(getContext()).get(1);
L.e(article.getUser() + " , " + article.getTitle());
}
public void testGetArticleWithUser(){
Article article = new ArticleDao(getContext()).getArticleWithUser(1);
L.e(article.getUser() + " , " + article.getTitle());
}
public void testListArticlesByUserId(){
List articles = new ArticleDao(getContext()).listByUserId(1);
L.e(articles.toString());
}
}
如何值传一个Article的Id,然后能够拿到Article对象,且内部的user属性直接赋值呢?
1)
article = articleDaoOpe.queryForId(id);
helper.getDao(User.class).refresh(article.getUser());
2)在user属性的注解上:@DatabaseField(canBeNull = true, foreign = true, columnName = "user_id", foreignAutoRefresh = true),添加foreignAutoRefresh =true,这样;当调用queryForId时,拿到Article对象则直接携带了user;
五、关联一个集合
每个User关联一个或多个Article,如果我在User中声明一个Collection articles,我能否在查询User的时候,一并能够获取到articles的值呢?
在User中添加如下属性,且注解如下:
@ForeignCollectionFieldprivate Collection articles;
六、条件查询QueryBuilder的使用
上述代码其实已经用到了简单的条件查询了:
1、简单的where等于
articleDaoOpe.queryBuilder().where().eq("user_id", userId).query();直接返回Article的列表
2、where and
QueryBuilder queryBuilder = articleDaoOpe.queryBuilder();
Where where = queryBuilder.where();
where.eq("user_id", 1);
where.and();
where.eq("name", "xxx");
//或者
articleDaoOpe.queryBuilder().//
where().//
eq("user_id", 1).and().//
eq("name", "xxx");
3、更复杂的查询
where.or(
//
where.and(//
where.eq("user_id", 1), where.eq("name", "xxx")),
where.and(//
where.eq("user_id", 2), where.eq("name", "yyy")));
七、updateBuilder、deleteBuilder
使用queryBuilder是因为我们希望执行完成查询直接返回List集合;
对于Update我们并不关注返回值,直接使用
articleDaoOpe.updateRaw(statement, arguments);传入sql和参数即可~~
同理还有deleteBuilder还是建议直接拼写sql,当然很简单的除外,直接使用它的API~
八、事务操作
Dao中直接写如下代码:
//事务操作
TransactionManager.callInTransaction(helper.getConnectionSource(),
new Callable(){
@Override
public Void call() throws Exception
{
return null;
}
});
在本篇中,简单介绍了ORMLite的基本用法,从简单查询到复杂查询,我们都可以根据自己的需要编写满足我们的需求的查询语句。
ORMLite
举报/反馈