配色: 字号:
Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包
2016-10-10 | 阅:  转:  |  分享 
  
Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包



事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的,不是我们三言两语就能解决的,我一直想抽个时间自己再过一遍Sqlite和JDBC的,但是,大家也知道,琐事比较多,我们来说一下数据库的框架吧,事实上市面上,我觉得还可以的数据库框架有两个,ORMLite和GreenDao,我以前做的运动类的应用上,就需要存储大量的运动数据,我们最开始是在本地写数据库的,那也是比较老的逻辑了,后来我们准备重构项目的时候,我决定把数据库也重构一下,因为我们当时的应用读取速度来还是比较慢的,比如你有一两年的数据之类的,我后来就研究了一下这两个框架,虽然我最后采用的是GreenDao,但是ORMLite也是研究了一会儿,所以,接下来,我将把这两个框架分两篇文章来分析,首先就是ORMLite了,网上还是有很多关于他们的文章的,所以我也是准备站在巨人的肩膀上,首先他们之间的优缺点,也有前辈写了,你可以参考一下

SQLite数据库框架ORMLite与GreenDao的简单比较

而且鸿洋老师也写了两篇关于ORMLite的文章

AndroidORMLite框架的入门用法

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

但是就算他们写了,我觉得我再根据自己的逻辑去讲一遍,很多人还是会收益的,我自信我的文笔应该还是算不错的,而且我是基于Androidstudio来讲的。嘻嘻,话不多说,我们来新建一个项目:



一.准备工作



在以前,我们写数据库时怎么写的?那就是频繁的去写SQLiteOpenHelper了,所以后来在我们开发中,很多人就喜欢封装他们,提高性能,也就出现了很多的数据库框架,ORMLite算是一个佼佼者了

们根据官方文档来看这个框架是怎么样集成的,官网上有共有四个步骤



然后添加到libs目录下,然后右键——AddAsLibrary就算是添加成功了,紧接着,我们在xml中写个按钮用来创建表和保存数据


android:id="@+id/btn_create_save"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="创建表|保存数据"/>



二.Bean类



OK,我们继续看文档,他需要编写一个bean类来声明一些表明和字段的



既然如此,那我们就创建好了,这个类可不简单,它主要通过注解去注明表单信息,然后映射给整个数据库,我们看

packagecom.lgl.ormlite;



importcom.j256.ormlite.field.DatabaseField;

importcom.j256.ormlite.table.DatabaseTable;



/

bean类,对应的整个数据库的表单信息,帮助我们映射到整个数据库当中

CreatedbyLGLon2016/6/26.

/

//配置表名

@DatabaseTable(tableName="user_info")

publicclassUser{

//配置主键id

@DatabaseField(generatedId=true)

privateintid;

//名称

@DatabaseField(columnName="name")

privateStringname;

//描述

@DatabaseField(columnName="desc")

privateStringdesc;



//空构造

publicUser(){



}

//构造方法

publicUser(intid,Stringname,Stringdesc){

this.id=id;

this.name=name;

this.desc=desc;

}



publicintgetId(){

returnid;

}



publicvoidsetId(intid){

this.id=id;

}



publicStringgetName(){

returnname;

}



publicvoidsetName(Stringname){

this.name=name;

}



publicStringgetDesc(){

returndesc;

}



publicvoidsetDesc(Stringdesc){

this.desc=desc;

}



@Override

publicStringtoString(){

return"User{"+

"id="+id+

",name=''"+name+''\''''+

",desc=''"+desc+''\''''+

''}'';

}

}

写起来还是逻辑性很强的,如果需要一些特别的参数的话,可以参考一下官网上的项目描述,首先在User类上添加@DatabaseTable(tableName=“user_info”),标明这是数据库中的一张表名字为user_info,然后分别在属性上添加@DatabaseField(columnName=“name”),columnName的值为该字段在数据中的列名,@DatabaseField(generatedId=true),generatedId表示id为主键且自动生成,好了,到这里,我们继续看官方的文档了

三.Dao类



官网写的很详细呀,我们跟着造轮子既可呀,嘿嘿,那我们就来写这个Dao类吧,注意,注释写的很清楚了哦!



packagecom.lgl.ormlite;



importandroid.content.Context;

importandroid.database.sqlite.SQLiteDatabase;



importcom.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;

importcom.j256.ormlite.dao.Dao;

importcom.j256.ormlite.support.ConnectionSource;

importcom.j256.ormlite.table.TableUtils;



importjava.sql.SQLException;

importjava.util.HashMap;

importjava.util.Map;



/

Dao类

CreatedbyLGLon2016/6/26.

/

publicclassDataBaseHelperextendsOrmLiteSqliteOpenHelper{



//创建数据库名称

privatestaticfinalStringDATABASE_NAME="ormlite_sql.db";

//版本号

privatestaticfinalintDATABASE_VERSION=1;

//存放Dao

privateMapmaps=newHashMap<>();



//单例模式

privatestaticDataBaseHelperinstance;



publicstaticsynchronizedDataBaseHelpergetInstance(Contextcontext){

if(instance==null){

synchronized(DataBaseHelper.class){

if(instance==null){

instance=newDataBaseHelper(context);

}

}

}

returninstance;

}



/

获得数据库的访问对象



@paramcls

@return

@throwsSQLException

/

publicsynchronizedDaogetDao(Classcls)throwsSQLException{

Daodao=null;

//通过反射获得类的名称

StringclsName=cls.getSimpleName();

//是否存在该对象

if(maps.containsKey(clsName)){

dao=maps.get(clsName);

}else{

dao=super.getDao(cls);

maps.put(clsName,dao);

}

returndao;

}



/

关闭所有操作

/

publicvoidclose(){

super.close();

//获取所有的map键值对置空

for(Stringkey:maps.keySet()){

Daodao=maps.get(key);

dao=null;

}

}



//构造方法

publicDataBaseHelper(Contextcontext){

//上下文,数据库名,null,版本号

super(context,DATABASE_NAME,null,DATABASE_VERSION);

}



//创建数据库

@Override

publicvoidonCreate(SQLiteDatabasesqLiteDatabase,ConnectionSourceconnectionSource){

try{

//对数据库的创建以及表的建立

TableUtils.clearTable(connectionSource,User.class);

}catch(SQLExceptione){

e.printStackTrace();

}

}



//更新数据库

@Override

publicvoidonUpgrade(SQLiteDatabasesqLiteDatabase,ConnectionSourceconnectionSource,inti,inti1){

try{

//调用更新就删除数据库

TableUtils.dropTable(connectionSource,User.class,true);

}catch(SQLExceptione){

e.printStackTrace();

}

}

}

到这里,我们的前期都OK了,紧接着,我们就可以去操作这些数据了

四.UserDao类



这个类主要是对数据的初始化和操作的

packagecom.lgl.ormlite;



importandroid.content.Context;



importcom.j256.ormlite.dao.Dao;



importjava.sql.SQLException;



/

数据库操作类

CreatedbyLGLon2016/6/26.

/

publicclassUserDao{



//上下文

privateContextmContext;

//主键查询

privateDaouserDao;

//Dao类

privateDataBaseHelperhelper;



publicUserDao(ContextmContext){

this.mContext=mContext;

//创建数据库

helper=DataBaseHelper.getInstance(mContext);

try{

//操作Dao

userDao=helper.getDao(User.class);

}catch(SQLExcwww.shanxiwang.neteptione){

e.printStackTrace();

}

}



publicvoidaddUser(Useruser){

try{

userDao.create(user);

}catch(SQLExceptione){

e.printStackTrace();

}

}

}

五.增



OK,基本上现在可以去实际的操作了,这个UserDao类我们等下还需要去完善,现在先这样,我们去实现按钮的点击事件

//点击事件

@Override

publicvoidonClick(Viewv){

switch(v.getId()){

caseR.id.btn_create_save:

userDao=newUserDao(this);

Useruser=newUser();

user.setName("lgl");

user.setDesc("Android");

userDao.addUser(user);

break;

}

}

到这里,我们就可以去操作了,我们去看数据库,打开DDMS



既然插入成功了,那我们尝试一下多条语句的插入吧

caseR.id.btn_create_save:

Useruser=newUser();

user.setName("lgl");

user.setDesc("Android");

userDao.addUser(user);



Useruser1=newUser();

user.setName("zhangsan");

user.setDesc("IOS");

userDao.addUser(user1);



Useruser2=newUser();

user.setName("lisi");

user.setDesc("python");



userDao.addUser(user2);

break;

OK,运行一下



六.改



我们继续操作UserDao这个类

//更新User

publicvoidupdateUser(Useruser){

try{

userDao.update(user);

}catch(SQLExceptione){

e.printStackTrace();

}

}



既然可以更新,那我们写个按钮


android:id="@+id/btn_update"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="修改数据"/>



写完之后,我们就可以执行了

caseR.id.btn_update:

//我们可以修改id为1的这个数据

Useruser3=newUser();

user3.setId(1);

user3.setName("lgl帅哥");

userDao.updateUser(user3);

break;



我们可以看下结果



OK,这就是我们的改了,我们可以封装一下

/

根据ID来更新

@paramuser

@paramid

/

publicvoidupdateById(Useruser,Integerid){

try{

userDao.updateId(user,id);

}catch(SQLExceptione){

e.printStackTrace();

}

}



还有一个修改方法

/

修改数据,支持多条



@paramuser

/

publicvoidupdateUserByBuilder(Useruser){

try{

UpdateBuilderbuilder=userDao.updateBuilder();

builder.updateColumnValue("name",user.getName()).where().eq("id",1);

builder.update();

}catch(SQLExceptione){

e.printStackTrace();

}

}



七.删除



删除我们可以根据条件删除,就直接贴代码了

/

删除



@paramuser

/

publicvoiddeleteUser(Useruser){

//删除的方法比较多,根据的条件也比较多

try{

userDao.delete(user);

}catch(SQLExceptione){

e.printStackTrace();

}

}



/

多个对象的删除操作



@paramusers

/

publicvoiddeleteMulUser(Listusers){

try{

userDao.delete(users);

}catch(SQLExceptione){

e.printStackTrace();

}

}



/

根据ID删除



@paramids

/

publicvoiddeleteUserById(Listids){

try{

userDao.deleteIds(ids);

}catch(SQLExceptione){

e.printStackTrace();

}

}

你要删除直接调用就好了

八.查



查算是比较多的场景了,我们也可以多条件查询,看我们全部查询的例子

/

全部查询



@return

/

publicListlistAll(){

try{

returnuserDao.queryForAll();

}catch(SQLExceptione){

e.printStackTrace();

}

returnnull;

}



但是我们一般也不会用到全部查询,条件查询才是必须的,所以我们再新建一个按钮




android:id="@+id/btn_query"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="查询数据"/>



OK.我们就可以查询了,我们写个单表查询

/

查询单张表



@return

/

publicListqueryBuilder(){

Listlist=null;

//查询器

QueryBuilderqueryBuilder=userDao.queryBuilder();

//声明where条件

Wherewhere=queryBuilder.where();

//查询sesc字段的name是哪个值

try{

where.eq("name","lgl");

where.and();

where.eq("desc","Android");

where.prepare();

list=queryBuilder.query();

//selectfromuser_infowherename=''lgl''anddesc=''Android''

}catch(SQLExceptione){

e.printStackTrace();

}

returnlist;

}



注意在点击事件里

caseR.id.btn_query:

Listlist=userDao.queryBuilder();

Log.i(TAG,list.toString());

break;



好的,我们现在看Log

这里写图片描述



我们多条件查询

/

多条件查询



@return

/

publicListqueryBuilders(){

Listlist=null;

QueryBuilderqueryBuilder=userDao.queryBuilder();

Wherewhere=queryBuilder.where();

try{

where.or(where.and(where.eq("",""),where.eq("","")),where.and(where.eq("",""),where.ge("",""))).query();

}catch(SQLExceptione){

e.printStackTrace();

}

returnlist;

}



这里我们就不演示了



最后,只能说,ORMLite是比较强大的,我们如果真的要去理解他的话,还是得去看他的API文档,不然真的无从下手!

献花(0)
+1
(本文系网络学习天...首藏)