在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