敢说敢作敢为, 无怨无恨无悔。这篇文章主要讲述Android xUtils框架 DbUtils相关的知识,希望能为你提供帮助。
在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;
- }
- }
这是怎么做到的呢?
第一步,先创建数据库
创建数据库
DaoConfig config = new DaoConfig(context);
config.setDbName("xUtils-demo"); //数据库名
config.setDbVersion(1); //数据库版本号
DbUtils db = DbUtils.create(config); //db还有其他的一些构造方法,比如含有更新表版本的监听器的 假如不设置监听器默认在升级的时候会将旧版本的表删掉
【Android xUtils框架 DbUtils】第二步,根据需求创建实体类,然后进行注解,注解方式如下图
下面这是常用到的一些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,_id或@Id注解Field为integer型时,primary key默认为autoincrement
此时,可以用@NoAutoIncrement注解该字段,使其不自增
[email protected]注解仅用于primary key.
4.一个类中,只可以使用一个@Id注解,当使用多个@Id注解时,primary key未知
5.一个类中,如果同时存在id,_id,@Id时,primary key优先级为 @Id > id > _id
[email protected]如果使用Column参数,则primary key列名为Column值
[email protected]如果不指明参数,则primary key列名为字段名
xUtils系列之DbUtils-Check注解Check注解定义:
- @Target(ElementType.FIELD)
- @Retention(RetentionPolicy.RUNTIME)
- public @interface Check {
- String value();
- }
- 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
推荐阅读
- 46.Android 自己定义Dialog
- Android 自己定义圆圈进度并显示百分比例控件(纯代码实现)
- android 聊天室窗体
- Android 开发笔记___登陆app
- Android 65K问题之Multidex原理分析及NoClassDefFoundError的解决方法
- hdoj 4925 Apple tree 最小割
- React Native Android打包apk
- SEO关键字研究工具合集(20大Google关键字规划师替代品)
- 如何修复Android你的连接不是私密的错误(解决方法教程)