Android xUtils框架(一) DbUtils
阿新 • • 發佈:2017-07-04
todo etc finder put build findall integer run get
在DbUtils中,只支持4中數據類型:
- public enum ColumnDbType {
- INTEGER("INTEGER"), REAL("REAL"), TEXT("TEXT"), BLOB("BLOB");
- private String value;
- ColumnDbType(String value) {
- this.value = value;
- }
- @Override
- public String toString() {
- return value;
- }
- }
而在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 唯一約束
查詢
- try {
- db.saveAll(list);
- db.findAll(Child.class);
- db.findAll(Selector.from(Child.class).where("id", ">", 2));
- db.findById(Child.class, 1);
- db.findFirst(Child.class);
- db.findFirst(Selector.from(Child.class).where("id", ">", 2));
- db.findDbModelAll(DbModelSelector.from(Child.class).groupBy("hobby").having(WhereBuilder.b("id", ">", 2)));
- db.findDbModelFirst(DbModelSelector.from(Child.class).groupBy("hobby").having(WhereBuilder.b("id", ">", 2)));
- Cursor c = db.execQuery(new SqlInfo("select * from child;"));
- //findDbModelFirst和findDbModelAll相當是對execQuery做了再次封裝,
- //返回的DbModel中,封裝了通過列名獲取value的方法,如:String getString(String columnName)等等.
- DbModel model = db.findDbModelFirst(new SqlInfo("select * from child;")); //采取原生sql語句,可以做多表查詢操作
- List<DbModel> modellist = db.findDbModelAll(new SqlInfo("select * from child;"));
- } catch (DbException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
用於更新表結構的數據,保存原來的數據
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註解定義:
- @Target(ElementType.FIELD)
- @Retention(RetentionPolicy.RUNTIME)
- public @interface Check {
- String value();
- }
DbUtils解析代碼:
- String check = ColumnUtils.getCheck(column.getColumnField());
- if (check != null) {
- sqlBuffer.append(" CHECK(").append(check).append(")");
- }
用法:
- @Column(column="age")
- @Check("age > 18")
- private int age;
xUtils系列之DbUtils-增,刪,更新,替換操作
http://blog.csdn.net/androidresearch/article/details/45704337
Android xUtils框架(一) DbUtils