package com.youshon.common.db;
import android.content.ContentValues;
import android.database.Cursor;
import android.util.Log;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by 520 on 2016/10/28.
*/
public class DbUtil {
private static final String TAG = "DbUtil";
public static final Map<Class<?>, String> TYPES;
static {
//基本类型
TYPES = new HashMap<Class<?>, String>();
TYPES.put(byte.class, "BYTE");
TYPES.put(boolean.class, "INTEGER");
TYPES.put(short.class, "SHORT");
TYPES.put(int.class, "INTEGER");
TYPES.put(long.class, "LONG");
TYPES.put(String.class, "TEXT");
TYPES.put(byte[].class, "BLOB");
TYPES.put(float.class, "FLOAT");
TYPES.put(double.class, "DOUBLE");
//包装类型
TYPES.put(Byte.class, "BYTE");
TYPES.put(Boolean.class, "INTEGER");
TYPES.put(Short.class, "SHORT");
TYPES.put(Integer.class, "INTEGER");
TYPES.put(Long.class, "LONG");
TYPES.put(String.class, "TEXT");
TYPES.put(byte[].class, "BLOB");
TYPES.put(Float.class, "FLOAT");
TYPES.put(Double.class, "DOUBLE");
}
/**
* 根据类结构构造表。
*/
public static String getTableBuildingSQL(Class<?> clazz) {
StringBuilder strBuilder = new StringBuilder("create table if not exists ");
if (clazz.isAnnotationPresent(TableName.class)) {
String tableName = clazz.getAnnotation(TableName.class).tableName();
strBuilder.append(tableName);
} else {
strBuilder.append(clazz.getSimpleName());
}
strBuilder.append("(");
// getDeclaredFields():获取该类文件中声明的字段
// getFields():获取该类public声明字段
Field[] arrField = clazz.getDeclaredFields();
for (int i = arrField.length - 1; i >= 0; i--) {
Field f = arrField[i];
String type = TYPES.get(f.getType());
if (type == null) {
continue;
} else {
strBuilder.append(f.getName() + " " + type);
if (f.isAnnotationPresent(Primary.class)) {
strBuilder.append(" primary key ");
}
if (f.isAnnotationPresent(DefaultText.class)) {
String val = f.getAnnotation(DefaultText.class).defaultVal();
strBuilder.append(" DEFAULT \"" + val + "\"");
}
if (f.isAnnotationPresent(DefaultInt.class)) {
Object val = f.getAnnotation(DefaultInt.class).defaultVal();
strBuilder.append(" DEFAULT " + val);
}
if (f.isAnnotationPresent(DefaultDecimal.class)) {
Object val = f.getAnnotation(DefaultDecimal.class).defaultVal();
strBuilder.append(" DEFAULT " + val);
}
if (f.isAnnotationPresent(Autoincrement.class)) {
strBuilder.append(" AUTOINCREMENT");
}
if(f.isAnnotationPresent(NotNull.class)){
strBuilder.append(" NOT NULL");
}
if (i > 0) {
strBuilder.append(",");
}
}
}
strBuilder.append(")");
return strBuilder.toString();
}
/**
* 构造插入Contvalues
*
* @param bean
* @return
*/
public static ContentValues translate2ContentValues(Object bean) {
ContentValues cv = new ContentValues();
Field[] arrField = bean.getClass().getDeclaredFields();
try {
for (Field f : arrField) {
if (f.isAccessible() == false) {
f.setAccessible(true);
}
//排除自動增長的字段
if (f.isAnnotationPresent(Autoincrement.class)) {
continue;
}
String name = f.getName();
Object value = f.get(bean);
if (value instanceof Byte) {
cv.put(name, (Byte) value);
} else if (value instanceof Short) {
cv.put(name, (Short) value);
} else if (value instanceof Integer) {
cv.put(name, (Integer) value);
} else if (value instanceof Long) {
cv.put(name, (Long) value);
} else if (value instanceof String) {
cv.put(name, (String) value);
} else if (value instanceof byte[]) {
cv.put(name, (byte[]) value);
} else if (value instanceof Boolean) {
cv.put(name, (Boolean) value);
} else if (value instanceof Float) {
cv.put(name, (Float) value);
} else if (value instanceof Double) {
cv.put(name, (Double) value);
}
}
} catch (Exception e) {
Log.e(TAG,"translate2ContentValues error:" + e.getMessage());
}
return cv;
}
/**
* 从cursor中提取bean
*
* @param cursor
* @param cls
* @param <T>
* @return
*/
public static <T> T cursorToBean(Cursor cursor, Class<T> cls) {
T bean = null;
if (cursor != null && cursor.getCount() > 0) {
Field[] fields = cls.getDeclaredFields();
String[] columns = cursor.getColumnNames();
try {
while (cursor.moveToNext()) {
bean = cls.newInstance();
for (String column : columns) {
Field field = findFieldByName(fields, column);
if (field != null) {
String letter = column.substring(0, 1).toUpperCase();
String setter = "set" + letter + column.substring(1);
Method setMethod = cls.getMethod(setter, new Class[]{field.getType()});
setMethod.invoke(bean, getValueByField(cursor, column, field));
}
}
}
} catch (Exception e) {
Log.e(TAG,"cursorToBean error:" + e.getMessage());
}finally {
cursor.close();
}
}
return bean;
}
/**
* 从cursor中提取bean 列表
*
* @param cursor
* @param cls
* @param <T>
* @return
*/
public static <T> List<T> cursorToBeans(Cursor cursor, Class<T> cls) {
List<T> beans = new ArrayList<T>();
if (cursor != null && cursor.getCount() > 0) {
Field[] fields = cls.getDeclaredFields();
String[] columns = cursor.getColumnNames();
try {
while (cursor.moveToNext()) {
T bean = cls.newInstance();
for (String column : columns) {
Field field = findFieldByName(fields, column);
if (field != null) {
String letter = column.substring(0, 1).toUpperCase();
String setter = "set" + letter + column.substring(1);
Method setMethod = cls.getMethod(setter, new Class[]{field.getType()});
setMethod.invoke(bean, getValueByField(cursor, column, field));
}
}
beans.add(bean);
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Common.zip (46个子文件)
Common
proguard-rules.pro 654B
Common.iml 11KB
src
test
java
com
youshon
common
ExampleUnitTest.java 939B
androidTest
java
com
youshon
common
ExampleInstrumentedTest.java 766B
main
res
mipmap-xxxhdpi
ic_launcher.png 10KB
drawable
tab_text_select.xml 340B
mipmap-hdpi
ic_launcher.png 3KB
values
attr.xml 310B
colors.xml 381B
strings.xml 80B
styles.xml 410B
dimens.xml 216B
mipmap-xxhdpi
ic_launcher.png 8KB
mipmap-mdpi
ic_launcher.png 2KB
mipmap-xhdpi
ic_launcher.png 5KB
layout
layout_tab_item.xml 460B
fragment_tab_4.xml 428B
fragment_tab_1.xml 408B
activity_main.xml 1KB
fragment_tab_3.xml 425B
activity_tab.xml 980B
fragment_tab_2.xml 424B
values-w820dp
dimens.xml 364B
java
com
youshon
common
db
Autoincrement.java 350B
DefaultDecimal.java 406B
DbHelper.java 666B
Primary.java 411B
TableName.java 386B
DefaultText.java 402B
DefaultInt.java 395B
NotNull.java 359B
Book.java 1KB
DbUtil.java 9KB
MainActivity.java 2KB
layout
tab
PageFragment3.java 646B
TabData.java 1KB
FraPageAdapter.java 1KB
PageFragment2.java 645B
PageFragment4.java 645B
PageFragment1.java 647B
ViewPageIndicator.java 3KB
TabActivity.java 1KB
TabLayout.java 4KB
AndroidManifest.xml 763B
.gitignore 8B
build.gradle 901B
libs
共 46 条
- 1
资源评论
快乐的编码小猪
- 粉丝: 8
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 2%EF%BC%9A%E9%99%95%E8%A5%BF%E
- yyspdz62_944.apk
- SAP公司间采购EDI配置-如何触发自动MIRO.docx
- python197基于图像识别的仪表实时监控系统.rar
- python196基于循环神经网络的情感分类系统.rar
- I2C驱动SHT30温湿度传感器和LCD12864使用例程(RSCG12864B)
- python193中学地理-中国的江河湖泊教学网(django).rar
- python191基于时间序列分析的大气污染预测软件(django).rar
- python190基于人脸识别智能化小区门禁管理系统.rar
- python189某医院体检挂号系统.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功