android ormlite 查询,关于androidORMLite的一些总结

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的基本用法,从简单查询到复杂查询,我们都可以根据自己的需要编写满足我们的需求的查询语句。

3685afd256c77e0c68082e2a0b9be72a.pngORMLite

举报/反馈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值