嘿嘿小伙伴们,今天是开始又是愉快的周末啦!小伙伴们平时周末都在干嘛,有没有学习啊!学习的小伙伴不妨也来多看看我的文章呀(臭不要脸)。话不多说,我们接着上一节讲的注解,更深层次的使用。
一、注解在Android中的使用
我们知道,注解的使用在Android项目开发当中是经常用到的,除了一些Android SDK里面自带的注解以及JDK自带的注解,里面还包括一些第三方框架使用的注解,其基本原理都是差不多的,下面来用注解来写一个简单的数据库框架。但是这个框架还是相对来说比较简单的。
Android数据库中原生的数据库的对象相关的类,在这里就简单的介绍一下了,因为只针对注解在Android项目中的使用来举例,让大家更深层次的理解。
图1.1
我们知道SQLiteDatabase对象在创建的时候是需要SQLiteOpenHelper去创建的,在创建数据库的时候需要创建表及其字段,那么如何用注解来实现我们的数据库框架达到自动建表以及简单的增删改查的效果呢?
二、创建注解实现数据库自动建表
1.创建表名相关的注解
我们知道每个数据库中都有各种各样的表,那么表名的如何用我们的注解去定义呢?看下面的例子
图2.1.1
根据代码可知,这里定义了一个叫DataBaseTable的注解,生命周期为运行时注解,作用域用的是Type,下面我们这里再写一个bean用来存储这个bean里面的数据,也用这个bean来创建一个表。
图2.1.2
到这里相信很多小伙伴们应该知道这些注解是干嘛用的了,在这里我们定义了一个表名注解类,其中这个注解有个叫 String value()的方法,这个方法呢,在修饰作用域的时候可以传一个String对象进去,这个String对象就是我们需要建表的 表名。
2.创建表的列名相关的注解
图2.2.1
图2.2.2
我们看到,这里我定义了另外两个注解,这两个注解的生命周期也是运行时注解,但是其作用域是在成员变量的。其中图2.2.1的注解呢,使用来实现我们数据库表的列名的,图2.2.2是实现我们数据库表中的自增长id的。我们通过这个注解修饰成员变量,通过反射的原理将表名与bean中的成员变量一一对应就可以实现建表与简单的增删改查了。
3.创建数据库操作相关的类的对象
在这里对这个不做过多表述,我们就以一些代码带过。
图2.3.1
图2.3.2
在这里我用DataBaseHepler创建了一个SQLiteDatabase对象,数据库名字为“test”,数据库版本为1,并且放在单例 模式下的DataBaseFactory下面。
4.创建数据库实际操作类
为此我们需要的所有跟数据库相关,表名与列名相关的(注解)类都已经创建好了,现在来创建数据库操作相关的类
首先我们先定义一个接口,这个接口有简单的增删改查的方法。
图2.4.1
图2.4.2
这里我们写了一些成员变量分别实现指定的功能,database为数据库操作的对象,entityClass为我们实际要保存的bean(即Test)的class对象,tableName为表名,以及表的缓存等。
在实现数据库增删该查的之前呢,首先我们要创建数据库的表,这时候呢就可以运用到我们之前自定义的注解DataBaseTable、DataBaseFeild、DataBaseKey了。看下列代码
图2.4.3
这里的initCacheMap方法呢,主要是将数据库的表名跟entityClass中的成员变量建立一对一的键值对关系保存在缓存里面,用于增删改查工作。
图2.4.4
图2.4.5
通过反射出我们上面定义的注解类并得到该注解类对应的value值,根据value值拼接自动建表语句
图2.4.6
图2.4.7
最后调用database.execSQL(sql)完成最后的建表,其中这里涉及到非常重要的概念叫反射,这里不做过多描述,后续章节将会详细讲解java反射的运用。
这里先抽取一部分代码作为解释,其中就是Field[] fields =entityClass.getDeclaredFields(),是通过class对象反射出该class的所有成员变量并返回一个数组的形式。field.getAnnotation(Annotion.class)可以得到该成员变量的指定的注解类。
5.简单的数据库操作
这里就以插入数据作为例子,其他的增删改查都是大同小异
图2.5.1
根据遍历缓存的cacheMap的键值对创建ConrtentValues对象,其中需要判断缓存的map里面的成员变量的数据类型创建ContentValues的值,并最终通过database的insert方法插入指定的表中完成数据插入的操作
图2.5.2
图2.5.3
在这里简单的通过注解方式与反射的方式实现Android数据库框架设计,当然这里写的数据库框架肯定是不够完善的,一个简单好用、性能良好的数据库框架不仅仅是通过简短的几行代码就可以实现的。
其他的数据库操作需要小伙伴们自行实现啦,可以练练手,当然如果上述存在什么疑问或者有什么良好的建议可以下方评论哟!最后祝大家事业顺心顺意!