Android xUtils框架 DbUtils

敢说敢作敢为, 无怨无恨无悔。这篇文章主要讲述Android xUtils框架 DbUtils相关的知识,希望能为你提供帮助。
在DbUtils中,只支持4中数据类型:

  1. public  enum  ColumnDbType  {   
  2.    
  3.         INTEGER("INTEGER"),  REAL("REAL"),  TEXT("TEXT"),  BLOB("BLOB");    
  4.    
  5.         private  String  value;    
  6.    
  7.         ColumnDbType(String  value)  {   
  8.                 this.value  =  value;    
  9.         }   
  10.    
  11.         @Override   
  12.         public  String  toString()  {   
  13.                 return  value;    
  14.         }   
  15. }  
而在java中,我们有8种基本类型,但是我们在使用DbUtils时,都能正确的对这些数据类型进行存取,
这是怎么做到的呢?
 
 
第一步,先创建数据库
 
创建数据库
  DaoConfig config =  new  DaoConfig(context);
  config.setDbName("xUtils-demo"); //数据库名
  config.setDbVersion(1);   //数据库版本号
  DbUtils db = DbUtils.create(config); //db还有其他的一些构造方法,比如含有更新表版本的监听器的 假如不设置监听器默认在升级的时候会将旧版本的表删掉
【Android xUtils框架 DbUtils】第二步,根据需求创建实体类,然后进行注解,注解方式如下图
 
下面这是常用到的一些Annotation(注解)      //注解可不等同于注释,不要混为一谈

  @Check     check约束
    @Column   列名
    @Finder   一对多、多对一、多对多关系(见sample的Parent、Child中的使用)
    @Foreign   外键
    @Id       主键,当为int类型时,默认自增。 非自增时,需要设置id的值
    @NoAutoIncrement   不自增
    @NotNull   不为空
    @Table     表名
    @Transient   不写入数据库表结构
    @Unique   唯一约束
 
查询
  1. try  {   
  2.                 db.saveAll(list);    
  3.                    
  4.                 db.findAll(Child.class);    
  5.                 db.findAll(Selector.from(Child.class).where("id",  "> ",  2));    
  6.                 db.findById(Child.class,  1);    
  7.                 db.findFirst(Child.class);    
  8.                 db.findFirst(Selector.from(Child.class).where("id",  "> ",  2));    
  9.                    
  10.                 db.findDbModelAll(DbModelSelector.from(Child.class).groupBy("hobby").having(WhereBuilder.b("id",  "> ",  2)));    
  11.                 db.findDbModelFirst(DbModelSelector.from(Child.class).groupBy("hobby").having(WhereBuilder.b("id",  "> ",  2)));    
  12.                    
  13.                    
  14.                    
  15.                 Cursor  c  =  db.execQuery(new  SqlInfo("select  *  from  child; "));    
  16.                    
  17.                 //findDbModelFirst和findDbModelAll相当是对execQuery做了再次封装,   
  18.                 //返回的DbModel中,封装了通过列名获取value的方法,如:String  getString(String  columnName)等等.   
  19.                 DbModel  model  =  db.findDbModelFirst(new  SqlInfo("select  *  from  child; "));   //采取原生sql语句,可以做多表查询操作   
  20.                 List< DbModel>   modellist  =  db.findDbModelAll(new  SqlInfo("select  *  from  child; "));    
  21.    
  22.         }  catch  (DbException  e)  {   
  23.                 //  TODO  Auto-generated  catch  block   
  24.                 e.printStackTrace();    
  25.         }  
 
用于更新表结构的数据,保存原来的数据

public static void updateTable(DbUtils dbUtils, Class< ?> tClass) { try { if (dbUtils.tableIsExist(tClass)) { String tableName = tClass.getName(); tableName = tableName.replace(".", "_"); String sql = "select * from " + tableName; //声名一个map用来保存原有表中的字段   Map< String, String> filedMap = new HashMap< > (); //执行自定义的sql语句   Cursor cursor = dbUtils.execQuery(sql); int count = cursor.getColumnCount(); for (int i = 0; i < count; i++) { filedMap.put(cursor.getColumnName(i), cursor.getColumnName(i)); } //cursor在用完之后一定要close   cursor.close(); //下面用到了一些反射知识,下面是获取实体类的所有私有属性(即我们更改表结构后的所有字段名)   Field[] fields = UserInfo.class.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { if (filedMap.containsKey(fields[i].getName())) { //假如字段名已存在就进行下次循环   continue; } else { //不存在,就放到map中,并且给表添加字段   filedMap.put(fields[i].getName(), fields[i].getName()); //根据属性的类型给表增加字段 if (fields[i].getType().toString().equals("class java.lang.String")) {dbUtils.execNonQuery("alter table " + tableName + " add " + fields[i].getName() + " TEXT "); } else if (fields[i].getType().equals("int") || fields[i].getType().equals("long") || fields[i].getType().equals("boolean")) { dbUtils.execNonQuery("alter table " + tableName + " add " + fields[i].getName() + " INTEGER "); } } }} } catch (DbException e) { e.printStackTrace(); } }




注意事项:
1.当类中有id或_id时,可以省略Id的注解

2.当id,_id或@Id注解Field为integer型时,primary key默认为autoincrement
此时,可以用@NoAutoIncrement注解该字段,使其不自增

[email  protected]注解仅用于primary key.

4.一个类中,只可以使用一个@Id注解,当使用多个@Id注解时,primary key未知

5.一个类中,如果同时存在id,_id,@Id时,primary key优先级为 @Id > id > _id

[email  protected]如果使用Column参数,则primary key列名为Column值

[email  protected]如果不指明参数,则primary key列名为字段名



 

xUtils系列之DbUtils-Check注解Check注解定义:
  1. @Target(ElementType.FIELD)   
  2. @Retention(RetentionPolicy.RUNTIME)   
  3. public  @interface  Check  {   
  4.         String  value();    
DbUtils解析代码:
  1. String  check  =  ColumnUtils.getCheck(column.getColumnField());    
  2. if  (check  !=  null)  {   
  3.         sqlBuffer.append("  CHECK(").append(check).append(")");    
  4. }  
用法:
  1. @Column(column="age")   
  2. @Check("age  >   18")   
  3. private  int  age;  
 
xUtils系列之DbUtils-增,删,更新,替换操作http://blog.csdn.net/androidresearch/article/details/45704337



































    推荐阅读