在DbUtils中,只支持4中數據類型:java
而在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 惟一約束
查詢
用於更新表結構的數據,保存原來的數據
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列名爲字段名
Check註解定義:
DbUtils解析代碼:
用法:
http://blog.csdn.net/androidresearch/article/details/45704337