Android xUtils框架(一) DbUtils

在DbUtils中,只支持4中數據類型:java

  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時,都能正確的對這些數據類型進行存取,
這是怎麼作到的呢?android

 

 

第一步,先建立數據庫sql

 

建立數據庫數據庫

  DaoConfig config = new DaoConfig(context);app

  config.setDbName("xUtils-demo"); //數據庫名ide

  config.setDbVersion(1);  //數據庫版本號ui

  DbUtils db = DbUtils.create(config);//db還有其餘的一些構造方法,好比含有更新表版本的監聽器的 假如不設置監聽器默認在升級的時候會將舊版本的表刪掉this

第二步,根據需求建立實體類,而後進行註解,註解方式以下圖spa

 

下面這是經常使用到的一些Annotation(註解)    //註解可不等同於註釋,不要混爲一談
.net

  @Check    check約束
  @Column   列名
  @Finder   一對多、多對1、多對多關係(見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

相關文章
相關標籤/搜索