Xutils3 数据库模块的使用方法

来源:互联网 发布:苹果恢复大师注册码mac 编辑:程序博客网 时间:2024/06/05 00:51

1.开源地址

https://github.com/wyouflf/xUtils3/tree/master

2.导入工程

使用Gradle构建时添加一下依赖即可:

 compile 'org.xutils:xutils:3.3.36'

3.使用步骤

  1. 使用XUtils3的一系列初始化。
  2. 创建一个javaBean类,该类即是需要存储的数据,在数据库中的表。
  3. 调用x.getDb方法获取DbManager对象
  4. 使用DbManager对象进行CRUD.

初始化XUtils3

ApplicationonCreate方法中加入如下代码

    //xUtils3初始化    x.Ext.init(this);    //是否打开log    x.Ext.setDebug(true);
添加权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.INTERNET" />


建立数据库的表(JavaBean

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

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

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

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

 

/**
 * Created by Administrator on 2016/7/8.
 * 数据库存储 表 的实体类
 * 在类名上加上@Table标签,标签里面的name就是以后生成数据库的表的表名。
 * 实体bean里面的属性,如果没有加上@Column,在生成表的时候,就不会在表里面加上该字段,反之亦然。
 */
@Table(name= "Parent")
public class Parent {
    //id
    @Column(name= "id",isId =true, autoGen= true)
    private intid;

    //姓名
    @Column(name= "name")
    privateString name;

    //年龄
    @Column(name= "age")
    private intage;

    //性别
    @Column(name= "sex")
    privateString sex;

    //工资
    @Column(name= "salary")
    privateString salary;

    public int getId() {
        returnid;
    }

    public voidsetId(intid) {
        this.id= id;
    }

    publicString getName() {
        returnname;
    }

    public voidsetName(String name) {
        this.name= name;
    }

    public intgetAge() {
        returnage;
    }

    public voidsetAge(intage) {
        this.age= age;
    }

    publicString getSex() {
        returnsex;
    }

    public voidsetSex(String sex) {
        this.sex= sex;
    }

    publicString getSalary() {
        returnsalary;
    }

    public voidsetSalary(String salary) {
        this.salary= salary;
    }

    @Override
    publicString toString() {
        return"[id=" + getId() +",name="+ getName() + ",age="+ getAge()
                + ",sex="+ getSex() + ",salary="+ getSalary() +"}\n";
    }
}

 

 

获取DBManager对象

DbManager db = x.getDb(DaoConfig daoConfig);

获取DbManager需要一个daoConfig对象。

 

 

 

注意:数据库里面表的创建的时间,只有在你对数据库里面的操作涉及到这张表的操作时,会先判断当前的表是否存在,如果不存在,才会创建一张表,如果存在,才会进行相应的CRUD操作,但是只要我们想进行一张表的CRUD操作,我们必须先执行上面的步骤,通俗点说就是必须拿到一个Dbmanger这个对象。

 

 

daoCinfig对象主要用于对于数据库的一些初始化设置

1.setDbName 设置数据库的名称

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

3.setDbVersion 设置数据库的版本

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

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

 

public classDbConfig {
    private staticDbManager.DaoConfig daoConfig;

    public static DbManager.DaoConfiggetDaoConfig(){
        File file = newFile(Environment.getExternalStorageDirectory().getPath());

        if(daoConfig== null){
            daoConfig= newDbManager.DaoConfig()
                    .setDbName("xiaoxiao.db")   //设置数据库的名字
//                    .setDbDir(file)             //设置数据库存储的位置
                    .setDbVersion(1)            //设置数据的版本号
                    .setAllowTransaction(true)  //设置是否允许开启事务
                    .setDbUpgradeListener(newDbManager.DbUpgradeListener() {//设置一个数据库版本升级的监听
                        @Override
                        public voidonUpgrade(DbManager db, intoldVersion, intnewVersion) {

                        }
                    });
        }
        returndaoConfig;
    }
}

 

通过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 删除数据库

 

添加数据

插入数据有三个方法

Save 插入数据

saveOrUpdate 插入数据,与save的区别:当一个实体里面的主键一样时如果使用saveOrUpdate会将当前主键对应的这条数据进行替换,而如果你使用了save就会报错。

saveBindingId 使用saveBindingId保存实体时会为实体的id赋值

/**
 * 存储Parent到数据库
 *
@paramparent 需要存储的对象
 *
@return
 
*/
public boolean insertParent(Parent parent) {
    try{
        returndbManager.saveBindingId(parent);
    }catch (DbException e) {
        e.printStackTrace();
    }
    return false;
}

 

查找数据

1.findById

通过主键的值来查找表里的数据

/**
 * 根据数据的唯一标识ID查找数据
 *
@paramentityType    需要查询的表
 *
@paramid
 *
@param <T>
 *@return
 
*/
public <T>T findByIdParent(Class<T> entityType,String id){
    try{
        returndbManager.findById(entityType,id);
    }catch (DbException e) {
        e.printStackTrace();
    }
    return null;
}

 

2.findFirst

返回表里的第一条数据

/**
 * 返回给定表的第一条数据
 *
@paramentityType
 *
@param <T>
 *@return
 
*/
public <T>T findFirstParent(Class<T> entityType){
    try{
        returndbManager.findFirst(entityType);
    }catch (DbException e) {
        e.printStackTrace();
    }
    return null;
}

3.findAll

返回给定表的所有数据

/**
 * 查询给定表的所有数据
 *
@paramentityType
 *
@param <T>
 *@return
 
*/
public <T> List<T>findAllParent(Class<T> entityType){
    try{
        returndbManager.findAll(entityType);
    }catch (DbException e) {
        e.printStackTrace();
    }
    return null;
}

4.Selector

返回指定条件查询出的数据

/**
 * 根据age和sex查询所有符合条件的Patent
 *
@paramentity
 *
@param Age
 *
@param sex
 *
@param <T>
 *@return
 
*/
public <T> List<T>selectByAgeAndSex(Class<T> entity, intAge,String sex){
    try{
        returndbManager.selector(entity).where("age",">",Age).and("sex","=",sex).findAll();
    }catch (DbException e) {
        e.printStackTrace();
    }
    return null;
}

 

下面两个方法主要使用sql语句查询数据:

该方法返回一个DbModel对象,该对象以hashMap的方式存储查询结构,即:key为表的字段,value为记录的值   例:   key:name   value:小丽

下面是DbModel的部分源码:

 

 

5.findDbModelFirst

返回sql语句查询到的第一条结果

/**
 * 根据给定sql语句返回查询到的第一条数据
 *
@paramsql sql语句
 *
@return
 
*/
public DbModelfindDbModelFirst(String sql){
    try{
        returndbManager.findDbModelFirst(newSqlInfo(sql));
    }catch (DbException e) {
        e.printStackTrace();
    }
    return null;
}

 

DbModel dbModel =dbHelper.findDbModelFirst("select * from Parent");
if(dbModel !=null){
    mTextView.setText(dbModel.getString("name"));
}

 

6.findDbModelAll

返回sql语句查询到的所有结果

/**
 * 根据给定sql语句返回查询到的所有数据
 *
@paramsql
 *
@return
 
*/
public List<DbModel>findDbModelAll(String sql){
    try{
        returndbManager.findDbModelAll(newSqlInfo(sql));
    }catch (DbException e) {
        e.printStackTrace();
    }
    return null;
}

 

List<DbModel> dbModelList =dbHelper.findDbModelAll("select * from Parent where age > 24");
StringBuilder builder = newStringBuilder();
if(dbModelList !=null){
    for(DbModel dbModel : dbModelList){
        builder.append(dbModel.getString("name") +"\n");
    }
    mTextView.setText(""+ builder.toString());
}

 

输出结果:

 

 

 

 

修改操作

 

1.修改单条数据的某个字段或多个字段。

Update第一个参数是需要修改的实体

第二个参数是一个可变参数,是你需要修改的字段的name

/**
 * 修改第一条数据的值
 */
public void update(){
    //将id为1的这条记录的数据的age修改为30,name修改为“张三丰”
    try{
        Parent parent = dbManager.findById(Parent.class,1);
        parent.setAge(30);
        parent.setName("张三丰");
        dbManager.update(parent,"name","age");
    }catch (DbException e) {
        e.printStackTrace();
    }
}

 

2.修改符合条件的数据的对应字段。

keyValue是一个键值对对象,第一个参数为字段名,第二个参数为需要修改成的值

whereBuilder.b   为需要修改数据的条件,符合的数据都会被修改。

public voidupdate2(){
    //将parent表中的性别为man的工资salasy都变为6000
    KeyValue keyValue =new KeyValue("salary","6000");
    try {
        dbManager.update(Parent.class,WhereBuilder.b("sex","=","men"),keyValue);
    }catch (DbException e) {
        e.printStackTrace();
    }
}

 

结果

 

 

 

删除操作

1.deleteById

根据指定的主键来删除对应的一条数据

/**
 * 根据主键进行单条数据的删除
 *
@paramentity
 *
@param id
 */
public void deleteById(Class entity,String id){
    try{
        dbManager.deleteById(entity,id);
    }catch (DbException e) {
        e.printStackTrace();
    }
}

 

2.delete(Object entity)

根据具体的实体对象来删除数据

/**
 *根据实体bean来删除数据
 */
public void deleteObject(){
    try{
        Parent parent = dbManager.findFirst(Parent.class);
        dbManager.delete(parent);
    }catch (DbException e) {
        e.printStackTrace();
    }
}

 

3.delete(Class<?> entityType)

删除指定表的所有数据,注意:删除的是数据,表还是存在的。

/**
 * 删除表里的所有数据
 * 注意:表还是会存在,只是数据没了
 */
public void deleteTableAllTate(){
    try{
        dbManager.delete(Parent.class);
    }catch (DbException e) {
        e.printStackTrace();
    }
}

 

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

根据where语句删除数据

/**
 * 根据where语句进行删除操作
 */
public void delteWhere(){
    //删除sex=men,   salary=6000的数据
    try{
        dbManager.delete(Parent.class,
                WhereBuilder.b("sex","=","men").and("salary","=","6000"));
    }catch (DbException e) {
        e.printStackTrace();
    }
}

 

5.dropTable(Class<?> entityType)

删除表

/**
 * 删除指定的表
 */
public void dropTable(){
    try{
        dbManager.dropTable(Parent.class);
    }catch (DbException e) {
        e.printStackTrace();
    }
}

6.dropDb()

删除数据库

/**
 * 删除数据库
 */
public void dropDb(){
    try{
        dbManager.dropDb();
    }catch (DbException e) {
        e.printStackTrace();
    }
}

 

给表增加字段

需求:我们需要在parent表中添加一个country字段。

步骤:

1.在parent类中添加country属性

2.调用dbManager.addColumn(Parent.class,"country");方法添加字段

3.在DbManager.DaoConfig()中的版本号+1,是否必须未知。

 

//国家
@Column(name= "country",property= "中国")
private Stringcountry ="";

 

/**
 * 添加country字段
 */
public void addColumn(){
    try{
        dbManager.addColumn(Parent.class,"country");
    }catch (DbException e) {
        e.printStackTrace();
    }
}

 

public synchronized staticDbHelper getInstance(){
    if(dbManager== null){
        dbHelper= newDbHelper();
    }
    if(dbManager== null){
        DbManager.DaoConfig daoConfig = DbConfig.getDaoConfig();
        dbManager= x.getDb(daoConfig);
    }
    dbHelper.addColumn();
    return dbHelper;
}

 


2 0