XUtils3.0数据库操作(转载)

DB注释相关

Studio  导入 

compile 'org.xutils:xutils:3.3.32'

1.加注了@Table的实体类将被映射到sqlite中的数据库表,@Table注解有属性name和onCreated两个属性,name属性决定了该实体类映射的数据库表名,而onCreated属性则可以用来添加表一级的属性或约束,例如创建联和唯一索引等

2.加注了@Column的实体类属性将会映射到sqlite数据库中的字段,@Column注解有name、property、isId、autoGen属性,name属性决定了实体类属性对应的数据库字段名;property属性可以用来添加数据库中字段一级的属性或约束条件例如not null,索引等;isId属性表示该字段是否是主键,默认为false;autoGen则表示如果一个字段为主键,是否自增长,默认为true,所以该字段只有在isId属性为true时有效.

3.未加注@Column注解的字段将不映射sqlite字段

 

 

通过XUti.getDaoConfig()方法,我们能够获取到一个DaoConfig对象。通过getDaoConfig()方法,我们可以知道这个方法主要可以做以下事情: 
1.setDbName 设置数据库的名称 
2.setDbDir 设置数据库存放的路径 
3.setDbVersion 设置数据库的版本 
4.setAllowTransaction(true) 设置允许开启事务 
5.setDbUpgradeListener 设置一个版本升级的监听方法 
那么具体我们什么时候创建的表呢?如果我们单纯的调用XUti.getDaoConfig()方法是不能够创建PersonTable这个实体对应的person这张表的,那么如何创建表呢? 
只需要一下几步: 
1.DaoConfig daoConfig=XUtil.getDaoConfig(); 
2.DbManager db = x.getDb(daoConfig);

3.只有在对表进行操作时,如果没有表则创建,有表则直接引用。

DbManager.DaoConfig daoConfig=new DbManager.DaoConfig()
        .setDbName("my.db")
        .setDbVersion(1)
        .setDbUpgradeListener(new DbManager.DbUpgradeListener() {
            @Override
            public void onUpgrade(DbManager db, int oldVersion, int newVersion) {

            }
        })
        .setDbOpenListener(new DbManager.DbOpenListener() {
            @Override
            public void onDbOpened(DbManager db) {
                db.getDatabase().enableWriteAheadLogging();
            }
        })
        .setDbDir(new File("/sdcard/download/"))
        .setAllowTransaction(true)
        .setTableCreateListener(new DbManager.TableCreateListener() {
            @Override
            public void onTableCreated(DbManager db, TableEntity<?> table) {
                //db.getDatabase().
            }
        });
 String n="";
 DbManager db=x.getDb(daoConfig);

 

 

增:

1.db.save(entity);//保存成功之后【不会】对user的主键进行赋值绑定

2.db.saveOrUpdate(entity);//如果一个对象主键为null则会新增该对象,成功之后【会】对user的主键进行赋值绑定,否则根据主键去查找更新

3.db.saveBindingId(entity);//保存成功之后【会】对user的主键进行赋值绑定,并返回保存是否成功

如:

    DbManager db=x.getDb(daoConfig);
MyXb myxb1=new MyXb();
myxb1.setName("huangyu");
myxb1.setAdress("626");
db.save(myxb1);
n+=myxb1.getId()+"\n";
MyXb myxb2=new MyXb();
myxb2.setName("zengxuefeng");
myxb2.setAdress("625");
db.saveBindingId(myxb2);
n+=myxb2.getId()+"\n";
MyXb myxb3=new MyXb();
myxb3.setName("wuyulun");
myxb2.setAdress("624");
db.saveOrUpdate(myxb3);
n+=myxb3.getId()+"\n";

输出结果

即原始对象存储在数据库中后,由数据库自己产生的id值(主键)赋予或不赋予原对象中的id(主键),save不赋予,saveOrUpdate和saveBindingId赋予原对象。

 

 

查:

1.findById的使用 :该方法主要是通过主键的值来进行查找表里面的数据 

用法:(DbManager).findById(类名,主键值);

如:

DbManager db=x.getDb(daoConfig);
try {
    MyXb ed=db.findById(MyXb.class,1);
    n+=ed;
    text.setText(n);
} catch (DbException e) {
    e.printStackTrace();
}

2.findFirst的使用: 该方法主要是返回当前表里面的第一条数据

  FindAll的使用: 该方法主要是返回当前表里面的全部数据(List形式)

用法:引用=(DbManager).findFirst(类名);

      List<类名> 引用=(DbManager).findAll(类名);

如:

DbManager db=x.getDb(daoConfig);
try {
    MyXb ed=db.findFirst(MyXb.class);
    n+=ed;
    text.setText(n);
} catch (DbException e) {
    e.printStackTrace();
}

3.selector的使用:用于特定条件的查找

用法:(DbManager).selector(类名).where(条件).and(条件)

DbManager db=x.getDb(daoConfig);
try {
    MyXb ed=db.selector(MyXb.class)
            .where("id", ">", 1)
            .findFirst();
    n+=ed;
    text.setText(n);
} catch (DbException e) {
    e.printStackTrace();
}

5.findDbModelFirst、findDbModelAll的使用

返回符合条件的DbModel

DbModell本质就是一个key为当前表的字段,value为当前某条记录的值的一个HashMap 

DbManager db=x.getDb(daoConfig);
try {
    DbModel ed=db.findDbModelFirst
            (new SqlInfo("select * from MyXb"));
    n+=ed.getString("id");
    text.setText(n);
} catch (DbException e) {
    e.printStackTrace();
}

注:SqlInfo:可以理解Sql语句,构造函数中传入String(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,WhereBuilder.b("sex", "=", "man"),"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进行对表里面的一条或多条数据进行删除 
需求:删除name为骆驼这条信息的记录

private void delete() {

       try {

           PersonTable person =db.selector(PersonTable.class).where("name", "=", "骆驼").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, WhereBuilder.b("sex","=", "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)    增加列

2.SqlInfo

 
这个类的结构很简单,包含两个成员变量,sql和bindArgs。SqlInfo用来表示执行实际操作时的sql语句对象,sqlBuilder是对其进行组装的工具类,仍然以上述的Parent类举例,当用户执行对一个Parent对象的插入操作时: 

可以看到sql表示执行的含有通配符的sql语句,该sql语句由sqlBuilder组装完成。bindArgs是一个ArrayList,bindArgs是可以单体sql语句中通配符的参数列表,该列表是个KeyValue组成的list,整体的结构如下图 
 
bindArgs中的keyValueList由12个对象组成,其中包括5个有效对象和7个空对象 
 
查看这个List每项的内容,可以发现如下 
 
这个BindArgs正式我们要绑定的数据的kv值,sqlBuilder通过把这个list组装成sql的参数,替代通配符形成最终的插入语句。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值