zoukankan      html  css  js  c++  java
  • 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还有其他的一些构造方法,比如含有更新表版本的监听器的 假如不设置监听器默认在升级的时候会将旧版本的表删掉

    第二步,根据需求创建实体类,然后进行注解,注解方式如下图

    下面这是常用到的一些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注解该字段,使其不自增

    3.@NoAutoIncrement注解仅用于primary key.

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

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

    6.@Id如果使用Column参数,则primary key列名为Column值

    7.@Id如果不指明参数,则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

  • 相关阅读:
    Spring MVC之LocaleResolver(解析用户区域)
    java.net.MalformedURLException: unknown protocol: c 这个错一般有两种原因导致: 1、URL协议、格式或者路径错误,
    ServletContext作用功能详解
    javax ee常用类
    前端控制器是整个MVC框架中最为核心的一块,它主要用来拦截符合要求的外部请求,并把请求分发到不同的控制器去处理,根据控制器处理后的结果,生成相应的响应发送到客户端。前端控制器既可以使用Filter实现(Struts2采用这种方式),也可以使用Servlet来实现(spring MVC框架)。
    随着时间的推移:构造SDK路径错误(An error occurred while automatically activating bundle com.android.ide.eclipse.adt)
    Smack+Openfire 接收和发送文件
    AVL旋转树
    创建一个数据库快照
    Mysql事务处理
  • 原文地址:https://www.cnblogs.com/lucktian/p/7117970.html
Copyright © 2011-2022 走看看