注解、反射实现SQLite操作
年前在看Annitation相关的知识,看着看着就想写点东西验证一下成绩,于是就有个这个SounderDao
先附上github地址SounderDao
先谈谈工具的思路:通过注解和反射将每个实体类解析为一个Table对象(Table中保存有数据表字段信息,表名称,建表语句信息),然后将Table保存到TableManager中,这样不必每次都需要去解析实体类,然后在Dao中实现增删查改的操作。
类文件结构如下:
这里写图片描述
其中annotation包中的Constraint为字段属性注解,FieldType为枚举常量类,Table为表名称注解,注意下面还有一个Table类,那是表信息类(怪我,取名字时把没注意上面的注解);Dao中就是一些数据库的操作处理了,model包中的Param为表字段的属性,如字段名称,字段类型等等;resolver包中的Resolver时注解解析器,util里的ComparatorUtil时集合排序类,对表里面的字段进行一次排序,让结果美观一点点。。。
使用步骤
1、解析出所有表信息
使用Dao中的静态方法initTables(Class
for(String key : TableManager.getInstance().getTableHashMap().keySet()){ db.execSQL(TableManager.getInstance().getTableHashMap().get(key).getCreateTableStatement());
}
1
2
在调用Dao.initTables()以后,就需要调用Dao.getInstance().setSQLiteOpenHelper()方法设置Helper对象,方才能够获取到SQLiteDatabase对象。(数据库会在SQLiteOpenHelper调用getXXXDatabase()后才会创建)
接下来就可进行数据表的操作了。
增
(ps:增删修改操作方法都在Dao类中)
public void insert(Object object){
Table table = TableManager.getInstance().get(object.getClass());
if(table == null){
throw new IllegalArgumentException("当前不存在该数据表信息");
}
//通过反射获取属性值并设置键值对
ContentValues cv = new ContentValues();
for(Param p : table.getParams()){
if(p.isPrimarykey()){
continue;
}
try {
Field field = object.getClass().getDeclaredField(p.getName());
field.setAccessible(true);
if(p.getType().equals(FieldType.TEXT.getType())){
cv.put(p.getColumn(),(String)field.get(object));
}else if(p.getType().equals(FieldType.INTEGER.getType())){
cv.put(p.getColumn(),(int)field.get(object));
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
mSQLiteDatabase = mSQLiteOpenHelper.getWritableDatabase();
long id = mSQLiteDatabase.insert(table.getTableName(),null,cv);
System.out.println("插入操作返回的id---->"+id);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
删
public int delete(Class<?> clz,String whereClause,String[] whereArgs){
Table table = TableManager.getInstance().get(clz);
if(table == null){
throw new IllegalArgumentException("没有当前表信息"+clz.getSimpleName());
}
mSQLiteDatabase = mSQLiteOpenHelper.getWritableDatabase();
return mSQLiteDatabase.delete(table.getTableName(),whereClause,whereArgs);
}
1
2
3
4
5
6
7
8
查
public ArrayList<Object> query(Class<?> clz, String whereClause){
Table table = TableManager.getInstance().get(clz);
if(table == null){
throw new IllegalArgumentException("没有当前表信息"+clz.getSimpleName());
}
ArrayList<Object> results = new ArrayList<>();
//查询全部
String sql = "select * from "+table.getTableName();
if(!TextUtil.isEmpty(whereClause)){
sql += " where "+whereClause;
}
sql += ";";
mSQLiteDatabase = mSQLiteOpenHelper.getReadableDatabase();
Cursor cursor = mSQLiteDatabase.rawQuery(sql,null);
while (cursor.moveToNext()){
try {
Object object = clz.newInstance();
for(Param p : table.getParams()){
Field field = clz.getDeclaredField(p.getName());
field.setAccessible(true);
if(p.getType().equals(FieldType.INTEGER.getType())){
field.set(object,cursor.getInt(cursor.getColumnIndexOrThrow(p.getColumn())));
}else{
field.set(object,cursor.getString(cursor.getColumnIndexOrThrow(p.getColumn())));
}
}
results.add(object);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
cursor.close();
return results;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
改
public int update(Class<?> clz,ContentValues cv,String whereClause,String[] whereArgs){
Table table = TableManager.getInstance().get(clz);
if(table == null){
throw new IllegalArgumentException("没有当前表信息"+ clz.getSimpleName());
}
mSQLiteDatabase = mSQLiteOpenHelper.getWritableDatabase();
return mSQLiteDatabase.update(table.getTableName(),cv,whereClause,whereArgs);
}
1
2
3
4
5
6
7
8
最后贴上本次测试Entity:Music
@Table("tb_music")
public class Music {
@Constraint(name = "_id",type = FieldType.INTEGER,primaryKey = true,autoInCrement = true)
private int id;
@Constraint(name = "_title")
private String title;
@Constraint(name = "_artist")
private String artist;
//省略了getter和setter方法
}
---------------------
作者:川黑今
来源:CSDN
原文:https://blog.csdn.net/u011146263/article/details/54848618
版权声明:本文为博主原创文章,转载请附上博文链接!

浙公网安备 33010602011771号