1. 程式人生 > >Android xUtils框架(一) DbUtils

Android xUtils框架(一) DbUtils

todo etc finder put build findall integer run get

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

  1. public enum ColumnDbType {
  2. INTEGER("INTEGER"), REAL("REAL"), TEXT("TEXT"), BLOB("BLOB");
  3. private String value;
  4. ColumnDbType(String value) {
  5. this.value = value;
  6. }
  7. @Override
  8. public String toString() {
  9. return value;
  10. }
  11. }

而在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. db.findAll(Child.class);
  4. db.findAll(Selector.from(Child.class).where("id", ">", 2));
  5. db.findById(Child.class, 1);
  6. db.findFirst(Child.class);
  7. db.findFirst(Selector.from(Child.class).where("id", ">", 2));
  8. db.findDbModelAll(DbModelSelector.from(Child.class).groupBy("hobby").having(WhereBuilder.b("id", ">", 2)));
  9. db.findDbModelFirst(DbModelSelector.from(Child.class).groupBy("hobby").having(WhereBuilder.b("id", ">", 2)));
  10. Cursor c = db.execQuery(new SqlInfo("select * from child;"));
  11. //findDbModelFirst和findDbModelAll相當是對execQuery做了再次封裝,
  12. //返回的DbModel中,封裝了通過列名獲取value的方法,如:String getString(String columnName)等等.
  13. DbModel model = db.findDbModelFirst(new SqlInfo("select * from child;")); //采取原生sql語句,可以做多表查詢操作
  14. List<DbModel> modellist = db.findDbModelAll(new SqlInfo("select * from child;"));
  15. } catch (DbException e) {
  16. // TODO Auto-generated catch block
  17. e.printStackTrace();
  18. }

用於更新表結構的數據,保存原來的數據
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,[email protected],primary key默認為autoincrement
此時,[email protected],使其不自增

3.@NoAutoIncrement註解僅用於primary key.

4.一個類中,[email protected],[email protected],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();
  5. }

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

Android xUtils框架(一) DbUtils