Android XUtils3框架的基本使用方法(二)

Android XUtils3框架的基本使用方法(二),第1张

概述上一篇Android中XUtils3框架使用方法详解(一)文章,主要介绍了XUtil3的注解模块,网络模块,图片加载模块,今天给大家带来数据库模块的讲解,现在主流的ORM框架很多,比如OrmLite,GreenDao,ActiveAndroid,Realm等等,

上一篇Android中XUtils3框架使用方法详解(一)文章,主要介绍了XUtil3的注解模块,网络模块,图片加载模块,今天给大家带来数据库模块的讲解,现在主流的ORM框架很多,比如Ormlite,GreenDao,Active AndroID,Realm等等,这些框架每个都有自己的优点和缺点,大家完全可以根据自己项目的实际需求进行选择,下面开始进入今天的数据库模块的介绍。

今天主要给大家带来以下几个模块:

如何创建删除一张表

如何对表进行增删查改 *** 作

如何创建数据库和删除数据库

如何建立一表对一表,多表对一表,多表对多表的外键 *** 作。

相信对ORM框架有过了解的人,大概都知道只要创建一个JavaBean对象,在类的上面和属性的上面添加注释标签,这样就能生成一个表。下面带大家看一下XUtils3的实体bean的写法:

@table(@R_301_6889@="person")public class Persontable {@Column(@R_301_6889@="ID",isID=true,autoGen=true)private int ID;//姓名@Column(@R_301_6889@="@R_301_6889@")private String @R_301_6889@;//年龄@Column(@R_301_6889@="age")private int age;//性别@Column(@R_301_6889@="sex")private String sex;//工资@Column(@R_301_6889@="salary")private String salary;public int getID() {return ID;}public voID setID(int ID) {this.ID = ID;}public String get@R_301_6889@() {return @R_301_6889@;}public voID set@R_301_6889@(String @R_301_6889@) {this.@R_301_6889@ = @R_301_6889@;}public String getSex() {return sex;}public voID setSex(String sex) {this.sex = sex;}public int getAge() {return age;}public voID setAge(int age) {this.age = age;}public String getSalary() {return salary;}public voID setSalary(String salary) {this.salary = salary;}@OverrIDepublic String toString() {return "Persontable [ID=" + ID + ",@R_301_6889@=" + @R_301_6889@ + ",age=" + age+ ",sex=" + sex + ",salary=" + salary + "]";}}

通过上方的实体bean,我们需要知道一个表对应的实体bean需要注意以下几点:

1.在类名上面加入@table标签,标签里面的属性@R_301_6889@的值就是以后生成的数据库的表的名字

2.实体bean里面的属性需要加上@Column标签,这样这个标签的@R_301_6889@属性的值会对应数据库里面的表的字段。

3.实体bean里面的普通属性,如果没有加上@Column标签就不会在生成表的时候在表里面加入字段。

4.实体bean中必须有一个主键,如果没有主键,表以后不会创建成功,@Column(@R_301_6889@=”ID”,autoGen=true)这个属性@R_301_6889@的值代表的是表的主键的标识,isID这个属性代表的是该属性是不是表的主键,autoGen代表的是主键是否是自增长,如果不写autoGen这个属性,默认是自增长的属性。

既然知道怎么写实体bean了,下面看看如何在程序中创建一个数据库和如何生成表的吧。

public class XUtil {static DbManager.DaoConfig daoConfig;public static DaoConfig getDaoConfig(){file file=new file(Environment.getExternalStorageDirectory().getPath());if(daoConfig==null){daoConfig=new DbManager.DaoConfig().setDb@R_301_6889@("shiyan.db").setDbDir(file).setDbVersion(1).setAllowTransaction(true).setdbupgradeListener(new dbupgradeListener() {@OverrIDepublic voID onUpgrade(DbManager db,int oldVersion,int newVersion) {}});}return daoConfig;}}

通过XUti.getDaoConfig()方法,我们能够获取到一个DaoConfig对象。通过getDaoConfig()方法,我们可以知道这个方法主要可以做以下事情:

1.setDb@R_301_6889@ 设置数据库的名称

2.setDbDir 设置数据库存放的路径

3.setDbVersion 设置数据库的版本

4.setAllowTransaction(true) 设置允许开启事务

5.setdbupgradeListener 设置一个版本升级的监听方法

那么具体我们什么时候创建的表呢?如果我们单纯的调用XUti.getDaoConfig()方法是不能够创建Persontable这个实体对应的person这张表的,那么如何创建表呢?

只需要一下几步:

1.DaoConfig daoConfig=XUtil.getDaoConfig();

2.DbManager db = x.getDb(daoConfig);

这里我要告诉大家的是,数据库里面表的创建的时间,只有在你对数据库里面的 *** 作涉及到这张表的 *** 作时,会先判断当前的表是否存在,如果不存在,才会创建一张表,如果存在,才会进行相应的CRUD *** 作,但是只要我们想进行一张表的CRUD *** 作,我们必须先执行上面的2步,通俗点说就是必须拿到一个Dbmanger这个对象,我为什么这么说呢?那么咱们就先看一下Dbmanger的庐山真面目吧。

DbManager部分源码如下:

public interface DbManager extends Closeable {DaoConfig getDaoConfig();sqliteDatabase getDatabase();/*** 保存实体类或实体类的List到数据库,* 如果该类型的ID是自动生成的,则保存完后会给ID赋值.** @param entity* @return* @throws DbException*/boolean saveBindingID(Object entity) throws DbException;/*** 保存或更新实体类或实体类的List到数据库,根据ID对应的数据是否存在.** @param entity* @throws DbException*/voID saveOrUpdate(Object entity) throws DbException;/*** 保存实体类或实体类的List到数据库** @param entity* @throws DbException*/voID save(Object entity) throws DbException;/*** 保存或更新实体类或实体类的List到数据库,根据ID和其他唯一索引判断数据是否存在.** @param entity* @throws DbException*/voID replace(Object entity) throws DbException;///////////// deletevoID deleteByID(Class<?> entityType,Object IDValue) throws DbException;voID delete(Object entity) throws DbException;voID delete(Class<?> entityType) throws DbException;voID delete(Class<?> entityType,WhereBuilder whereBuilder) throws DbException;///////////// updatevoID update(Object entity,String... updateColumn@R_301_6889@s) throws DbException;voID update(Object entity,WhereBuilder whereBuilder,String... updateColumn@R_301_6889@s) throws DbException;///////////// find<T> T findByID(Class<T> entityType,Object IDValue) throws DbException;<T> T findFirst(Class<T> entityType) throws DbException;<T> List<T> findAll(Class<T> entityType) throws DbException;<T> Selector<T> selector(Class<T> entityType) throws DbException;DbModel findDbModelFirst(sqlInfo sqlInfo) throws DbException;List<DbModel> findDbModelAll(sqlInfo sqlInfo) throws DbException;///////////// table/*** 删除表** @param entityType* @throws DbException*/voID droptable(Class<?> entityType) throws DbException;/*** 添加一列,* 新的entityType中必须定义了这个列的属性.** @param entityType* @param column* @throws DbException*/voID addColumn(Class<?> entityType,String column) throws DbException;///////////// db/*** 删除库** @throws DbException*/voID dropDb() throws DbException;/*** 关闭数据库,* xUtils对同一个库的链接是单实例的,一般不需要关闭它.** @throws IOException*/voID close() throws IOException;///////////// customvoID execNonquery(sqlInfo sqlInfo) throws DbException;voID execNonquery(String sql) throws DbException;Cursor execquery(sqlInfo sqlInfo) throws DbException;Cursor execquery(String sql) throws DbException;}

通过DbManager这个类我们知道主要它做了以下几件事情:

1.getDaoConfig 获取数据库的配置信息

2.getDatabase 获取数据库实例

3.saveBindingID saveOrUpdate save 插入数据的3个方法(保存数据)

4.replace 只有存在唯一索引时才有用 慎重

5.delete *** 作的4种方法(删除数据)

6.update *** 作的2种方法(修改数据)
7.find *** 作6种方法(查询数据)

8.droptable 删除表

9.addColumn 添加一列

10.dropDb 删除数据库

插入 *** 作

private voID insert() {try {Persontable person=new Persontable();person.set@R_301_6889@("小丽");person.setAge(19);person.setSex("woman");person.setSalary(4000);db.save(person);//db.saveOrUpdate(person);//db.saveBindingID(person);} catch (DbException e) {e.printstacktrace();}}

结果如下:

 

3种插入 *** 作所需要的参数都是一个实体bean。save和saveOrUpdate的区别就是当一个实体里面的主键一样时如果使用saveOrUpdate会将当前主键对应的这条数据进行替换,而如果你使用了save就会报错。

saveBindingID主要是存进去的数据如果当前表有主键回合主键进行绑定关联。
当你执行完这个方法后,你会看到数据库里面person表里面多了一条数据.

查询 *** 作

当前数据库中的表的效果如下:

 

1.findByID的使用

该方法主要是通过主键的值来进行查找表里面的数据
需求:查找上方person表里面ID为3的数据

private voID query(){try {Persontable person = db.findByID(Persontable.class,"2");Log.e("person",person.toString());} catch (DbException e) {e.printstacktrace();}}

结果如下:

 

2.findFirst的使用

该方法主要是返回当前表里面的第一条数据
需求:查找上方person表里面的第一条数据

private voID query() {try {Persontable person = db.findFirst(Persontable.class);Log.e("person",person.toString());} catch (DbException e) {e.printstacktrace();}}

 

3.findAll的使用

该方法主要是返回当前表里面的所有数据

需求:查找person表里面的所有数据

private voID query() {try {List<Persontable> persons = db.findAll(Persontable.class);Log.e("persons",persons.toString());} catch (DbException e) {e.printstacktrace();}}

 

4.selector的使用

该方法主要是用来进行一些特定条件的查找
需求:查找person表里面age大于30并且性别为man的数据

private voID query() {try {List<Persontable> persons = db.selector(Persontable.class).where("age",">",30).and("sex","=","man").findAll();for(Persontable person:persons){Log.e("person",person.toString());}} catch (DbException e) {e.printstacktrace();}}

 

5.findDbModelFirst的使用

说起这个方法,该方法返回一个DbModel对象,那么该对象是什么呢?

DbMobel源码如下:

public final class DbModel {/*** key: column@R_301_6889@* value: valueStr*/private HashMap<String,String> dataMap = new HashMap<String,String>();public String getString(String column@R_301_6889@) {return dataMap.get(column@R_301_6889@);}public int getInt(String column@R_301_6889@) {return Integer.valueOf(dataMap.get(column@R_301_6889@));}public boolean getBoolean(String column@R_301_6889@) {String value = dataMap.get(column@R_301_6889@);if (value != null) {return value.length() == 1 ? "1".equals(value) : Boolean.valueOf(value);}return false;}public double getDouble(String column@R_301_6889@) {return Double.valueOf(dataMap.get(column@R_301_6889@));}public float getfloat(String column@R_301_6889@) {return float.valueOf(dataMap.get(column@R_301_6889@));}public long getLong(String column@R_301_6889@) {return Long.valueOf(dataMap.get(column@R_301_6889@));}public Date getDate(String column@R_301_6889@) {long date = Long.valueOf(dataMap.get(column@R_301_6889@));return new Date(date);}public java.sql.Date getsqlDate(String column@R_301_6889@) {long date = Long.valueOf(dataMap.get(column@R_301_6889@));return new java.sql.Date(date);}public voID add(String column@R_301_6889@,String valueStr) {dataMap.put(column@R_301_6889@,valueStr);}/*** @return key: column@R_301_6889@*/public HashMap<String,String> getDataMap() {return dataMap;}/*** @param column@R_301_6889@* @return*/public boolean isEmpty(String column@R_301_6889@) {return TextUtils.isEmpty(dataMap.get(column@R_301_6889@));}}

通过源码,我们分析发现DbModel本质就是一个key为当前表的字段,value为当前某条记录的值的一个HashMap.
需求:查找person表中第一条数据的那个人的年龄age是多少。

private voID query() {try {DbModel model = db.findDbModelFirst(new sqlInfo("select * from person"));Log.e("age",model.getString("age"));} catch (DbException e) {e.printstacktrace(); }}

 

注意上面的sqlInfo对象的创建的构造参数只需要传入一个SQL语句即可。

6.findDbModelAll的用法

该方法的用途就是返回满足sqlInfo信息的所有数据的字段的一个集合。

需求:查找person表中年龄age大于25里面的所有人的姓名

private voID query() {try {List<DbModel> persons = db.findDbModelAll(new sqlInfo("select * from person where age > 25"));for(DbModel person:persons){Log.e("@R_301_6889@",person.getString("@R_301_6889@"));}} catch (DbException e) {e.printstacktrace();}}

基本把查询的6种方式都说了一遍,当然上面的6种需求不一定完全用上面的查询方法可以查出结果,我这么查询的目的主要是带领大家熟悉一下XUtils3的6种查询方法是如何使用的,会了上面的6种方法,我相信你的查询不会有太大问题,至于复杂的查询无非就是SQL语句的基本功力了,大家赶紧动手 *** 练一下吧。

修改 *** 作

当前数据库中的表的效果如下:

 

修改一共有2种方法:

第一种:

需求:我们把上面的ID为1的这条记录的age修改为25岁

private voID update() {try{Persontable person = db.findByID(Persontable.class,1);person.setAge(25);db.update(person,"age");}catch(Exception e){e.printstacktrace();}}

通过方法,我们知道首先要通过DBManager通过查找的方法先找到ID为1的这个实体bean,如果你对里面的哪个字段需要修改,只需要重新set这个属性的值,然后调用DBManager.update方法,第一个参数是需要修改的实体,第二个参数是对应的属性。

 

第二种:

需求:将person表中性别为man的工资salary都变成6000。

private voID update() {try {List<Persontable> persons = db.findAll(Persontable.class);for(Persontable person:persons){person.setSalary(6000);db.update(person,WhereBuilder.b("sex","man"),"salary");}} catch (Exception e) {e.printstacktrace();}}

修改数据一共就2种方法,基本都是需要一个实体bean对象去进行 *** 作的,上面的第二种方法无非就是在修改数据时,多了一个限制条件,这样修改数据显得灵活一些。

上面第二种update的方法的参数简单介绍一下:

第一个参数:实体bean对象

第二个参数:一个WhereBuilder对象,主要是通过静态b方法去构造一个where条件语句

第三个参数:需要修改的字段名,如果你的需求是修改了2个或者更多个字段,只需要在后面加上相应的参数即可,例如第二种方法我不止修改salary还需要修改age统一为40岁,参考如下;

private voID update() {try {List<Persontable> persons = db.findAll(Persontable.class);for(Persontable person:persons){person.setSalary(6000);person.setAge(40);db.update(person,"salary","age");}} catch (Exception e) {e.printstacktrace();}}

删除 *** 作

当前数据库中的person表的效果如下:

 

1.deleteByID的用法

该方法主要是根据表的主键进行单条记录的删除

需求:删除上方person表中ID为5的记录

private voID delete() {try {db.deleteByID(Persontable.class,5);} catch (DbException e) {e.printstacktrace();}}

结果如下:

 

2.delete(Object entity)的用法

该方法主要是根据实体bean进行对表里面的一条或多条数据进行删除

需求:删除@R_301_6889@为骆驼这条信息的记录

private voID delete() {try {Persontable person = db.selector(Persontable.class).where("@R_301_6889@","骆驼").findFirst();db.delete(person);} catch (DbException e) {e.printstacktrace(); }}

 

3.delete(Class<?> entityType)

该方法主要是用来删除表格里面的所有数据,但是注意:表还会存在,只是表里面数据没有了

private voID delete() {try {db.delete(Persontable.class);} catch (DbException e) {e.printstacktrace(); }}

4.delete(Class<?> entityType,WhereBuilder whereBuilder)

该方法主要是根据where语句的条件进行删除 *** 作

需求:将person表总sex为woman并且salary为5000的信息删除

private voID delete() {try {db.delete(Persontable.class,"woman").and("salary","5000"));} catch (DbException e) {e.printstacktrace();}}

 

5.droptable(Class<?> entityType)

该方法是用来删除表

private voID delete() {try {db.droptable(Persontable.class);} catch (DbException e) {e.printstacktrace();}}

6.dropDb()

该方法是用来删除数据库

db.dropDb();

其他方法

1.addColumn(Class<> entityType,String column)

需求:在上方表中加入一个country字段

Persontable的实体代码如下:

@table(@R_301_6889@="person")public class Persontable {@Column(@R_301_6889@="ID",autoGen=true)private int ID;//姓名@Column(@R_301_6889@="@R_301_6889@")private String @R_301_6889@;//年龄@Column(@R_301_6889@="age")private int age;//性别@Column(@R_301_6889@="sex")private String sex;//工资@Column(@R_301_6889@="salary")private int salary;//国家@Column(@R_301_6889@="country",property="中国")private String country;public int getID() {return ID;}public voID setID(int ID) {this.ID = ID;}public String get@R_301_6889@() {return @R_301_6889@;}public voID set@R_301_6889@(String @R_301_6889@) {this.@R_301_6889@ = @R_301_6889@;}public String getSex() {return sex;}public voID setSex(String sex) {this.sex = sex;}public int getAge() {return age;}public voID setAge(int age) {this.age = age;}public int getSalary() {return salary;}public voID setSalary(int salary) {this.salary = salary;}public String getCountry() {return country;}public voID setCountry(String country) {this.country = country;}@OverrIDepublic String toString() {return "Persontable [ID=" + ID + ",salary=" + salary + ",country="+ country + "]";}}private voID addColumn() {try {db.addColumn(Persontable.class,"country");} catch (DbException e) {e.printstacktrace();}}

执行完addColumn方法,我们看到person表里面多了一个country字段.

结果如下:

总结

上面主要介绍了XUtils3的数据库模块,包括如何创建数据库,如何创建表,如何给表进行添加一列,如何对表进行增删查改的 *** 作。说了这么多,相信大家肯定对XUtils3的数据库模块有了一个基本的理解,至于一表对一表,多表对一表,多表对多表等等这类需求,无非就是在某个表里面加入一个字段,或者创建一个第三方表用来维护表与表之间的关系,这种类型的例子我就不举例说明了,原因是那些需求都离不开上面的增删查改的方法,我相信你只要把上面的方法完全会用,你的XUtils3的数据库模块的基本使用就不会有问题了。

总结

以上是内存溢出为你收集整理的Android XUtils3框架的基本使用方法(二)全部内容,希望文章能够帮你解决Android XUtils3框架的基本使用方法(二)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1148736.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存