xUtils中DbUtils用法

xUtils在实际开发中用的比较多,今天也想写篇文章,也不知道写点什么,就随便写点关于dbUtils的吧。

首先简单介绍一下xUtils框架吧:

  • xUtils 包含了很多实用的android工具。

  • xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响...

  • xUitls 最低兼容android 2.2 (api level 8)

  • 原来据说在android 5.0的系统中,xUtils网络请求存在缺陷,不过在最新的xUtils中已经解决

目前xUtils主要有四大模块:

  • DbUtils模块

  • ViewUtils模块

  • HttpUtils模块

  • BitmapUtils

相对来说,xUtils这个框架还是比较优秀的,它在内部做了不少处理,为程序猿们省了不少事。不过我觉得四个模块里面还是DbUtils比较爽,在项目中缓存一些数据的时候,只需要简单的一句就可以把一个实体类保存到数据库。(其实我自己,关于网络请求的我用的是okhttp,加载图片用的是ImageLoader,虽然xUtils在这方面也不错,but。。。接着说DbUtils的用法吧)

首先你要添加相应权限:

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

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

创建数据库

  DaoConfig config = new DaoConfig(context);

  config.setDbName("xUtils-demo"); //db名

  config.setDbVersion(1);  //db版本

  DbUtils db = DbUtils.create(config);//db还有其他的一些构造方法,比如含有更新表版本的监听器的

创建表

  db.createTableIfNotExist(User.class); //创建一个表User

    db.save(user);//在表中保存一个user对象。最初执行保存动作时,也会创建User表

删除表

  db.dropTable(User.class); 


开启事务

  db.configAllowTransaction(true);


db相关Annotation

  @Check    check约束
  @Column   列名
  @Finder   一对多、多对一、多对多关系(见sample的Parent、Child中的使用)
  @Foreign  外键
  @Id       主键,当为int类型时,默认自增。 非自增时,需要设置id的值
  @NoAutoIncrement  不自增
  @NotNull  不为空
  @Table    表名
  @Transient  不写入数据库表结构
  @Unique   唯一约束

一些常用的方法

DbUtils db = DbUtils.create(this);
User user = new User(); //这里需要注意的是User对象必须有id属性,或者有通过@ID注解的属性
user.setEmail("[email protected]");
user.setName("wyouflf");
db.save(user); // 使用saveBindingId保存实体时会为实体的id赋值

...
// 查找
Parent entity = db.findById(Parent.class, parent.getId());
List<Parent> list = db.findAll(Parent.class);//通过类型查找

Parent Parent = db.findFirst(Selector.from(Parent.class).where("name","=","test"));

// IS NULL
Parent Parent = db.findFirst(Selector.from(Parent.class).where("name","=", null));
// IS NOT NULL
Parent Parent = db.findFirst(Selector.from(Parent.class).where("name","!=", null));

// WHERE id<54 AND (age>20 OR age<30) ORDER BY id LIMIT pageSize OFFSET pageOffset
List<Parent> list = db.findAll(Selector.from(Parent.class)
                                   .where("id" ,"<", 54)
                                   .and(WhereBuilder.b("age", ">", 20).or("age", " < ", 30))
                                   .orderBy("id")
                                   .limit(pageSize)
                                   .offset(pageSize * pageIndex));

// op为"in"时,最后一个参数必须是数组或Iterable的实现类(例如List等)
Parent test = db.findFirst(Selector.from(Parent.class).where("id", "in", new int[]{1, 2, 3}));
// op为"between"时,最后一个参数必须是数组或Iterable的实现类(例如List等)
Parent test = db.findFirst(Selector.from(Parent.class).where("id", "between", new String[]{"1", "5"}));

DbModel dbModel = db.findDbModelAll(Selector.from(Parent.class).select("name"));//select("name")只取出name列
List<DbModel> dbModels = db.findDbModelAll(Selector.from(Parent.class).groupBy("name").select("name", "count(name)"));
...

List<DbModel> dbModels = db.findDbModelAll(sql); // 自定义sql查询
db.execNonQuery(sql) // 执行自定义sql

简单说一下注意点吧,Dbutils利用的是反射来对实体类进行操作的,这个具体原理我就不解释了。上面也说了必须给实体类注解一个Id,Dbutils在保存对象到数据库的时候,会给Id一个默认的值0,在数据库中它会默认自增.大家不要以为这个Id只是用来唯一标识一个对象的,在你进行更新操作的时候,DbUtils也会默认按照Id去更新某一条属性,假如找不到相应的Id它就会更新失败。今天先写到这把 ,困了。。。有什么不明白的,可以给我留言,我会的尽量解答。
 
    




你可能感兴趣的:(xUtils中DbUtils用法)