package com.devyk.ykdblib.db.imp;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.text.TextUtils;
import android.util.Log;
import com.devyk.ykdblib.annotation.YKField;
import com.devyk.ykdblib.annotation.YKTable;
import com.devyk.ykdblib.db.Condition;
import com.devyk.ykdblib.db.IBaseDao;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* <pre>
* author : devyk on 2019-07-31 17:17
* blog : https://juejin.im/user/578259398ac2470061f3a3fb/posts
* github : https://github.com/yangkun19921001
* mailbox : [email protected]
* desc : This is BaseDaoImp
* </pre>
*/
public class BaseDaoImp<T> implements IBaseDao<T> {
private String TAG = getClass().getSimpleName();
/**
* 持有数据库的引用
*/
private SQLiteDatabase mSQLiteDatabase;
/**
* 表名
*/
private String mTableName;
/**
* 持有操作数据库所对应的 java 类型
*/
private Class<T> mEntityClass;
/**
* 标记:用来表示是否已经初始化操作
*/
private boolean isInit = false;
/**
* 定义一个缓存空间 (key:字段名 value: 成员变量)
*/
private HashMap<String, Field> mCacheMap;
/**
* 初始化
*
* @param sqLiteDatabase
* @param entityClass
*/
public void init(SQLiteDatabase sqLiteDatabase, Class<T> entityClass) {
this.mSQLiteDatabase = sqLiteDatabase;
this.mEntityClass = entityClass;
if (!isInit) {
//自动建表,取得表名
if (entityClass != null && (entityClass.getAnnotation(YKTable.class) == null)) {
//通过反射得到类名
this.mTableName = entityClass.getSimpleName();
} else {
if (TextUtils.isEmpty(entityClass.getAnnotation(YKTable.class).value())) {
//如果有注解但是注解为空的话,就取当前 类名
this.mTableName = entityClass.getSimpleName();
} else {
//取得注解上面的表名
this.mTableName = entityClass.getAnnotation(YKTable.class).value();
}
}
//执行创建表的操作, 使用 getCreateTabeSql () 生成 sql 语句
String autoCreateTabSql = getCreateTableSql();
Log.i(TAG, "tagSQL-->" + autoCreateTabSql);
//执行创建表的 SQL
this.mSQLiteDatabase.execSQL(autoCreateTabSql);
mCacheMap = new HashMap<>();
initCacheMap();
isInit = true;
}
}
private void initCacheMap() {
//取得所有字段名称
String sql = "select * from " + mTableName + " limit 1, 0";//创建一个空间 sql
Cursor cursor = mSQLiteDatabase.rawQuery(sql, null);
String[] columnNames = cursor.getColumnNames();
//2. 取得所有的成员变量
Field[] declaredFields = mEntityClass.getDeclaredFields();
//字段 跟 成员变量
for (String columnName : columnNames) {
Field columnField = null;
for (Field field : declaredFields) {
//访问权限打开
field.setAccessible(true);
String fileName = ""; //对象中成员变量名字
if (field.getAnnotation(YKField.class) != null) {
fileName = field.getAnnotation(YKField.class).value();
} else {
fileName = field.getName();
}
if (columnName.equals(fileName)) {//匹配
columnField = field;
break;
}
}
if (columnField != null) {
mCacheMap.put(columnName, columnField);
}
}
}
/**
* 需要被执行创建表的 sql
*
* @return
*/
private String getCreateTableSql() {
StringBuffer sb = new StringBuffer();
sb.append("create table if not exists ").append(mTableName + "(");
//反射得到所有的成员变量
Field[] declaredFields = mEntityClass.getDeclaredFields();
for (Field declaredField : declaredFields) {
//首先拿到成员的属性
Class<?> type = declaredField.getType();
//通过注解获取
if (declaredField.getAnnotation(YKField.class) != null) {
//通过注解获取
if (type == String.class) {
sb.append(declaredField.getAnnotation(YKField.class).value() + " TEXT,");
} else if (type == Integer.class) {
sb.append(declaredField.getAnnotation(YKField.class).value() + " INTEGER,");
} else if (type == Long.class) {
sb.append(declaredField.getAnnotation(YKField.class).value() + " BIGINT,");
} else if (type == Double.class) {
sb.append(declaredField.getAnnotation(YKField.class).value() + " DOUBLE,");
} else if (type == byte[].class) {
sb.append(declaredField.getAnnotation(YKField.class).value() + " BLOB,");
} else {
//不支持的类型
continue;
}
} else {
//通过反射获取
if (type == String.class) {
sb.append(declaredField.getName() + " TEXT,");
} else if (type == Integer.class) {
sb.append(declaredField.getName() + " INTEGER,");
} else if (type == Long.class) {
sb.append(declaredField.getName() + " BIGINT,");
} else if (type == Double.class) {
sb.append(declaredField.getName() + " DOUBLE,");
} else if (type == byte[].class) {
sb.append(declaredField.getName() + " BLOB,");
} else {
//不支持的类型
continue;
}
}
}
//删除最后一位
if (sb.charAt(sb.length() - 1) == ',') {
sb.deleteCharAt(sb.length() - 1);
}
sb.append(")");
return sb.toString();
}
/**
* 插入数据
* @param entity
* @return
*/
@Override
public long insert(T entity) {
//1. 准备好 ContentValues 中需要的数据
Map<String, String> map = getValues(entity);
if (map == null || map.size() == 0) return 0;
//2. 把数据转移到 ContentValues 中
ContentValues values = getContentValues(map);
//将数据插入表中
return mSQLiteDatabase.insert(mTableName, null, values);
}
/**
* @param map 成员变量的名字,成员变量的值
* @return
*/
private ContentValues getContentValues(Map<String, String> map) {
ContentValues contentValues = new ContentValues();
Set<String> keys = map.keySet();
Iterator<String> iterator = keys.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
String values = map.get(key);
if (values != null) {
contentValues.put(key, values);
}
}
return contentValues;
}
/**
* key(字段) - values(成员变量) ---》getValues 后 ---》key (成员变量的名字) ---values 成员变量的值 id 1,name alan , password 123
*
* @param entity
* @return
*/
private Map<String, String> getValues(T entity) {
HashMap<String, String> map = new HashMap<>();
//返回所有的成员变量
Iterator<Field> iterator = mCacheMap.values
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
YKDB.zip (54个子文件)
YKDB-master
gradle.properties 1KB
gradle
wrapper
gradle-wrapper.jar 53KB
gradle-wrapper.properties 232B
app
src
androidTest
java
com
devyk
ykdb
ExampleInstrumentedTest.java 699B
test
java
com
devyk
ykdb
ExampleUnitTest.java 375B
main
java
com
devyk
ykdb
Contacts.java 317B
MainActivity.java 2KB
bean
Police.java 1KB
res
mipmap-xxhdpi
ic_launcher_round.png 10KB
ic_launcher.png 6KB
mipmap-hdpi
ic_launcher_round.png 5KB
ic_launcher.png 3KB
drawable-v24
ic_launcher_foreground.xml 2KB
mipmap-anydpi-v26
ic_launcher.xml 272B
ic_launcher_round.xml 272B
mipmap-mdpi
ic_launcher_round.png 3KB
ic_launcher.png 2KB
mipmap-xxxhdpi
ic_launcher_round.png 15KB
ic_launcher.png 9KB
mipmap-xhdpi
ic_launcher_round.png 7KB
ic_launcher.png 4KB
values
colors.xml 208B
strings.xml 67B
styles.xml 383B
layout
activity_main.xml 1KB
drawable
ic_launcher_background.xml 5KB
AndroidManifest.xml 902B
proguard-rules.pro 751B
build.gradle 1KB
.gitignore 7B
gradlew.bat 2KB
ykdblib
src
androidTest
java
com
devyk
ykdblib
ExampleInstrumentedTest.java 710B
test
java
com
devyk
ykdblib
ExampleUnitTest.java 378B
main
java
com
devyk
ykdblib
annotation
YKTable.java 634B
YKField.java 624B
db
BaseDaoFactory.java 3KB
IBaseDao.java 653B
Condition.java 2KB
imp
BaseDaoImp.java 13KB
res
values
strings.xml 70B
AndroidManifest.xml 104B
proguard-rules.pro 751B
build.gradle 813B
.gitignore 7B
build.gradle 682B
.idea
codeStyles
Project.xml 2KB
dbnavigator.xml 22KB
runConfigurations.xml 564B
misc.xml 7KB
gradle.xml 580B
encodings.xml 135B
settings.gradle 27B
gradlew 5KB
.gitignore 203B
共 54 条
- 1
资源评论
金戈鐡馬
- 粉丝: 1w+
- 资源: 51
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功