框架整理系列一(数据库)

DBHelper.java

public class DBHelper extends SQLiteOpenHelper {
// 默认本数据库名称
private static final String DATABASE_NAME = "lhoa.db";

// 表集合
//public static Class<?>[] ClassList = new Class[]{FarmerTable.class, DiseaseTable.class};
public static ArrayList<Class> ClassList = new ArrayList<>();

/**
 * 数据库版本升级
 */
private static final int DATABASE_VERSION = 7; //2.0增加药品库位和ID
/**
 * @param context
 */
public DBHelper(Context context) {
//
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

/**
 * @param context
 * @param dataName
 */
public DBHelper(Context context, String dataName) {
//
super(context, dataName, null, DATABASE_VERSION);
}

/**
 * @param context
 * @param dataName
 * @param version
 */
public DBHelper(Context context, String dataName, int version) {
//
super(context, dataName, null, version);
}

@Override
public void onCreate(SQLiteDatabase db) {
try {
Log.i("Sqlite", "Create dataBase**********************");
if (ClassList.size() > 0) {
for (int i = 0; i < ClassList.size(); i++) {
String tableName = ClassList.get(i).getSimpleName();
Field[] declaredFields = ClassList.get(i).getDeclaredFields(); // 加局部变量
// 遍历方法集合
Log.i("OrmHelper", "=== start traversing getXX methods===="+tableName);
// 如果类里面的变量数目大于0,新建基础表
if (declaredFields.length > 0) {
db.execSQL("DROP TABLE IF EXISTS " + tableName);
db.execSQL("CREATE TABLE IF NOT EXISTS " + tableName + " (_id INTEGER PRIMARY KEY AUTOINCREMENT )");
for (int m = 0; m < declaredFields.length; m++) { //针对类里每个属性增加表的各个字段
Class<?> cl = declaredFields[m].getType();
String TypeName = cl.getSimpleName();
if (TypeName.equals("int") || TypeName.equals("double") || TypeName.equals("float")) {
db.execSQL("ALTER TABLE " + tableName + " ADD '" + declaredFields[m].getName() + "' INTEGER");
} else {
db.execSQL("ALTER TABLE " + tableName + " ADD '" + declaredFields[m].getName() + "' VARCHAR");
}
}
}
}
}

} catch (Exception e) {
// TODO: handle exception
Log.i("Set_ZeroError", e.getClass().toString());
}
}

//
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.i("Sqlite", "ALTER dataBase *******************************");
if (oldVersion < DATABASE_VERSION) {
try {
 onCreate(db);
  //  UpdateDB(db);
} catch (Exception e) {
// TODO: handle exception
Log.e("Sql_error", e.getMessage().toString());
}
}
}

/**
 * 重置数据
 */
public void SetZero(String TableName) {
}

public static void DeleteDataBase(Context context) {
context.deleteDatabase(DATABASE_NAME);
}

/**
 * 判断表是否存在,若不存在,则创建
 *
 * @param context
 * @param cls
 */
public static void CreateTableWithJudge(Context context, Class<?> cls) {
if (!isHave(context, cls)) {
CreateTable(context, cls);
}
}

public static boolean isHave(Context context, Class<?> userClass) {
boolean result = false;
try {
DBHelper db = new DBHelper(context);
SQLiteDatabase database = db.getWritableDatabase();
String tableName = userClass.getSimpleName();
String sql = "select * from sqlite_sequence where name like  '" + tableName + "'";
Cursor cursor = database.rawQuery(sql, null);
if (cursor.getCount() > 0) {
result = true;
} else {
result = false;
}
cursor.close();
database.close();
} catch (Exception ex) {
ex.fillInStackTrace();
}
return result;
}

/**
 * 快捷建表 表名 Equip
 * 例:DBHelper.CreateTable(CariAndroidOrmPronActivity.this,Equip.class);
 *
 * @param userClass
 */
public static void CreateTable(Context context, Class<?> userClass) {
try {
DBHelper db = new DBHelper(context);
SQLiteDatabase database = db.getWritableDatabase();
String tableName = userClass.getSimpleName();
Field[] methods = userClass.getDeclaredFields(); // 加载变量属性
// 遍历方法集合
Log.i("OrmHelper", "=== start traversing getXX methods===="+tableName);
// 如果类里面的变量数目大于0,新建基础表
if (methods.length > 0) {
database.execSQL("CREATE TABLE IF NOT EXISTS " + tableName + " (_id INTEGER PRIMARY KEY AUTOINCREMENT )");
Log.i("OrmHelper","CREATE TABLE IF NOT EXISTS " + tableName + " (_id INTEGER PRIMARY KEY AUTOINCREMENT )");
}
for (int i = 0; i < methods.length; i++) {
Class<?> cl = methods[i].getType();
String TypeName = cl.getSimpleName();
if (TypeName.equals("int")) {
Log.i("OrmHelper","ALTER TABLE " + tableName + " ADD '" + methods[i].getName() + "' int");
database.execSQL("ALTER TABLE " + tableName + " ADD '" + methods[i].getName() + "' int");
} else {
Log.i("OrmHelper","ALTER TABLE " + tableName + " ADD '" + methods[i].getName() + "' VARCHAR");
database.execSQL("ALTER TABLE " + tableName + " ADD '" + methods[i].getName() + "' VARCHAR");
}
}
database.close();
db.close();
Log.i("OrmHelper", "=== end ====");
} catch (Exception e) {
e.printStackTrace();
}
}

/**
 * 升级数据库
 */
public void UpdateDB(SQLiteDatabase db) {
if (ClassList.size() > 0) {
for (int i = 0; i < ClassList.size(); i++) {
String tableName = ClassList.get(i).getSimpleName();
Field[] methods = ClassList.get(i).getDeclaredFields(); // 加载变量属性,加载所有字段
CompareTableAndCreate(db, tableName, methods);
}
}
}

/**
 * 对比需要生成的数据库表与设备中当前存在的数据库表的差别,并对有差别的表进行删除和重建
 */
private static void CompareTableAndCreate(SQLiteDatabase db, String table, Field[] methods) {
// if(clear)
// db.execSQL("drop table if exists "+table);
String sql = "_id INTEGER PRIMARY KEY AUTOINCREMENT";
for (int i = 0; i < methods.length; i++) {
Class<?> cl = methods[i].getType();
String TypeName = cl.getSimpleName();
if (TypeName.equals("int"))
sql = sql + "," + methods[i].getName() + " int";
else
sql = sql + "," + methods[i].getName() + " VARCHAR";
}

// 判断新数据库的字段是否与旧数据库一致,不一致则删除重建
boolean a = true;
for (int j = 0; j < methods.length; j++) {
a = checkColumnExist(db, table, methods[j].getName());
if (a == false)
break;
}
if (a == false) {
Log.i("CompareTableAndCreate", table);
db.execSQL("drop table if exists " + table);
db.execSQL("create table if not exists " + table + "(" + sql + ")");
} else
db.execSQL("create table if not exists " + table + "(" + sql + ")");

}

/**
 * 判断需要生成的表中的字段与数据库中已有的表的字段是否一致
 */
static public boolean checkColumnExist(SQLiteDatabase db, String tableName, String columnName) {
boolean result = true;
Cursor cursor = null;
int index = -1;
try {
// 查询一行
cursor = db.rawQuery("SELECT * FROM " + tableName + " LIMIT 0", null);
if (cursor != null) {
index = cursor.getColumnIndex(columnName);
if (index == -1)
result = false;
} else
result = false;
} catch (Exception e) {
Log.i("checkColumnExistError", e.getMessage());
result = false;
} finally {
if (null != cursor && !cursor.isClosed()) {
cursor.close();
}
}
return result;
}

}

DataBaseUtil.java

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.nio.channels.FileChannel;
import java.util.ArrayList;


/**
 * @author zhouzhou
 * @Title: SqliteHelper
 * @Description:
 * @Company: www.cari.com.cn
 * @date 2015-9-24 下午5:03:18
 */
public class DataBaseUtil {
/**
 * 反射机制,从数据库到数据表
 *
 * @param context
 * @param cls
 * @return
 */
@SuppressWarnings("unchecked")
public static ArrayList<Object> GetData(Context context, Class cls) {
return GetData(context, cls, "");
}

public static Object GetOneData(Context context, Class cls, String sqlStr){
ArrayList<Object> datas = GetData(context,cls,sqlStr);
if(datas.size()>0){
return datas.get(0);
}else {
return null;
}
}

/**
 * 反射机制,从数据库到数据表
 *
 * @param context
 * @param cls
 * @return
 */
@SuppressWarnings("unchecked")
public static ArrayList<Object> GetData(Context context, Class cls, String sqlStr) {
ArrayList<Object> resultList = new ArrayList<Object>();
try {
DBHelper dbhelper = new DBHelper(context);
SQLiteDatabase db = dbhelper.getReadableDatabase(); // 上传id大于多少的....
String selectStr = cls.getDeclaredFields()[0].getName();
for (int i = 1; i < cls.getDeclaredFields().length; i++) {
selectStr = selectStr + "," + cls.getDeclaredFields()[i].getName();
}
Cursor cursor = db.rawQuery("SELECT " + selectStr + " FROM " + cls.getSimpleName() + " " + sqlStr, null);
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
Object obj = cls.newInstance();
for (int i = 0; i < cursor.getColumnCount(); i++) {
if (cursor.getString(i) != null) {
ReflectionHelper.doMethod("set" + toUpperCaseFirstOne(cursor.getColumnName(i)), obj, cursor.getString(i), cls.getDeclaredFields()[i].getType());
}
}
resultList.add(obj);
}
if (cursor != null) {
cursor.close();
}
db.close();
dbhelper.close();
} catch (Exception e) {
// TODO: handle exception
Log.e("SQLite ERROR", e.getMessage().toString());
}
return resultList;
}

/**
 * 向数据库中插入数据ArrayList
 *
 * @param context
 * @param cls
 * @param
 */
public static void saveArrayListData(Context context, Class<?> cls, Object obj) {
String JsonStr = GsonUtil.toJson(obj);
JSONArray jsonArray = null;
try {
jsonArray = new JSONArray(JsonStr);
saveJsonArrayData(context, cls, jsonArray);
} catch (JSONException e) {
e.printStackTrace();
}
}

/**
 * 向数据库中插入单个数据
 *
 * @param context
 * @param cls
 * @param
 */
public static void saveObjectData(Context context, Class<?> cls, Object obj) {
String JsonStr = GsonUtil.toJson(obj);
JSONObject jsonObject = null;
try {
jsonObject = new JSONObject(JsonStr);
} catch (JSONException e) {
e.printStackTrace();
}
saveJsonObjct(context, cls, jsonObject);
}

/**
 * 插入JsonArray
 *
 * @param context
 * @param cls
 * @param jsonArray
 */
public static void saveJsonArrayData(Context context, Class<?> cls, JSONArray jsonArray) {
DBHelper db = new DBHelper(context);
SQLiteDatabase dataBase = db.getWritableDatabase();
try {
dataBase.beginTransaction(); // 手动设置开始事务
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject itemdata = (JSONObject) jsonArray.get(i);
dataBase.insert(cls.getSimpleName(), null, InSertContentValues(cls, itemdata));
}
dataBase.setTransactionSuccessful(); // 设置事务处理成功,不设置会自动回滚不提交
Log.i("SQLite", "Success insert info into SqliteDatabase " + cls.getSimpleName());

} catch (Exception e) {
Log.e("SQLite ERROR " + cls.getSimpleName(), e.getMessage().toString());
} finally {
dataBase.endTransaction(); // 处理完成
dataBase.close();
db.close();
}
}

/**
 * 插入JSONObject
 *
 * @param context
 * @param cls
 * @param jsonObject
 */
public static void saveJsonObjct(Context context, Class<?> cls, JSONObject jsonObject) {
DBHelper db = new DBHelper(context);
SQLiteDatabase dataBase = db.getWritableDatabase();
try {
dataBase.insert(cls.getSimpleName(), null, InSertContentValues(cls, jsonObject));
Log.i("SQLite", "Success insert info into SqliteDatabase " + cls.getSimpleName());
} catch (Exception e) {
Log.e("SQLite ERROR " + cls.getSimpleName(), e.getMessage().toString());
} finally {
dataBase.endTransaction(); // 处理完成
dataBase.close();
db.close();
}
}

/**
 * 向ContentValues插入JSONObject
 *
 * @param cls
 * @param jsonObject
 * @return
 * @throws JSONException
 */
public static ContentValues InSertContentValues(Class<?> cls, JSONObject jsonObject) throws JSONException {
ContentValues cv = new ContentValues();
JSONObject itemdata = jsonObject;
Field[] fields = cls.getDeclaredFields();
for (int j = 0; j < fields.length; j++) {
        if (itemdata.has(fields[j].getName().toString())) {
cv.put(fields[j].getName().toString(), itemdata.getString(fields[j].getName().toString()));
}
}
return cv;
}

/**
 * 清空指定数据表
 *
 * @param context
 * @param cls
 */
public static void clearTable(Context context, Class<?> cls) {
DBHelper db = new DBHelper(context);
SQLiteDatabase dataBase = db.getWritableDatabase();
try {
dataBase.execSQL("delete from " + cls.getSimpleName());
} catch (Exception e) {
Log.e("SQLite ERROR " + cls.getSimpleName(), e.getMessage().toString());
} finally {
dataBase.close();
db.close();
}
}

public static void getOutDataBase() {
File f = new File("/data/data/com.lihua.oa/databases/lhoa.db"); //比如  "/data/data/com.hello/databases/test.db"
String sdcardPath = Environment.getExternalStorageDirectory().getAbsolutePath();
File o = new File(sdcardPath + "/cp.db"); //sdcard上的目标地址
if (f.exists()) {
FileChannel outF;
try {
outF = new FileOutputStream(o).getChannel();
new FileInputStream(f).getChannel().transferTo(0, f.length(), outF);
Log.e("sqlite", "数据库拷贝成功");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

//首字母转大写
public static String toUpperCaseFirstOne(String s)
{
if(Character.isUpperCase(s.charAt(0)))
return s;
else
return (new StringBuilder()).append(Character.toUpperCase(s.charAt(0))).append(s.substring(1)).toString();
}
}

ReflectionHelper.java

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author zhouzhou
 * @Title: ReflectionHelper
 * @Description:
 * @Company: www.cari.com.cn
 * @date 2015-9-24 下午4:01:53
 */
public class ReflectionHelper {
/**
 * 快捷填充对象(标准化的对象)
 *
 * @param MethodName
 * @param o  调用此方法的对象
 * @param paras  调用的这个方法的参数参数列表
 */
public static void getMethod(String MethodName, Object o, Object[] paras) {
Class c[] = null;
if (paras != null) {// 存在
int len = paras.length;
c = new Class[len];
for (int i = 0; i < len; ++i) {
c[i] = paras[i].getClass();
}
}
try {
Method method = null;
if (c[0].getSimpleName().equals("Integer")) {
method = o.getClass().getDeclaredMethod(MethodName, int.class);
} else {
method = o.getClass().getDeclaredMethod(MethodName, c);
}
try {
method.invoke(o, paras);// 调用o对象的方法
} catch (IllegalAccessException ex) {
ex.fillInStackTrace();
} catch (IllegalArgumentException ex) {
ex.fillInStackTrace();
} catch (InvocationTargetException ex) {
ex.fillInStackTrace();
}
} catch (NoSuchMethodException ex) {
ex.fillInStackTrace();
} catch (SecurityException ex) {
ex.fillInStackTrace();
}

}

public static void getMethod(String MethodName, Object o, Object paras) {
Class c = null;
if (paras != null) {// 存在
c = paras.getClass();
}
try {
Method method = null;
if (c.getSimpleName().equals("Integer")) {
method = o.getClass().getDeclaredMethod(MethodName, int.class);
} else {
method = o.getClass().getDeclaredMethod(MethodName, c);
}
try {
method.invoke(o, paras);// 调用o对象的方法
} catch (IllegalAccessException ex) {
ex.fillInStackTrace();
} catch (IllegalArgumentException ex) {
ex.fillInStackTrace();
} catch (InvocationTargetException ex) {
ex.fillInStackTrace();
}
} catch (NoSuchMethodException ex) {
ex.fillInStackTrace();
} catch (SecurityException ex) {
ex.fillInStackTrace();
}

}

public static void doMethod(String MethodName, Object o, Object paras) {
Class c = null;
if (paras != null) {// 存在
c = paras.getClass();
}
try {
Method method = null;
if (c.getSimpleName().equals("Integer")) {
method = o.getClass().getDeclaredMethod(MethodName, int.class);
} else {
method = o.getClass().getDeclaredMethod(MethodName, c);
}
try {
method.invoke(o, paras);// 调用o对象的方法
} catch (IllegalAccessException ex) {
ex.fillInStackTrace();
} catch (IllegalArgumentException ex) {
ex.fillInStackTrace();
} catch (InvocationTargetException ex) {
ex.fillInStackTrace();
}
} catch (NoSuchMethodException ex) {
ex.fillInStackTrace();
} catch (SecurityException ex) {
ex.fillInStackTrace();
}

}

public static void doMethod(String MethodName, Object o, String paras, Class parasType) {
try {
Method method = o.getClass().getDeclaredMethod(MethodName, parasType);
try {
if (parasType.equals(int.class)) {
method.invoke(o, Integer.parseInt(paras));
} else if (parasType.equals(Double.class)) {
method.invoke(o, Double.parseDouble(paras));
} else
method.invoke(o, paras);// 调用o对象的方法
} catch (IllegalAccessException ex) {
ex.fillInStackTrace();
} catch (IllegalArgumentException ex) {
ex.fillInStackTrace();
} catch (InvocationTargetException ex) {
ex.fillInStackTrace();
}
} catch (NoSuchMethodException ex) {
ex.fillInStackTrace();
} catch (SecurityException ex) {
ex.fillInStackTrace();
}

}
}

引用

1: 使用JSONTFORMAT 将json生成对应格式的bean.class
2: 在MyApplication中初始化表。

DBHelper.ClassList.add(DiseaseTable.class);
DBHelper.ClassList.add(FarmerTable.class);
DBHelper.ClassList.add(FeedTable.class);
DBHelper.ClassList.add(FeedDisplayTable.class);
DBHelper.ClassList.add(BaseFarmer.class);
DBHelper.ClassList.add(Medicine.class); //药品

3:在接口中存储/读取表数据:

public void success(JSONArray resultArray) {
    if (resultArray.length() > 0) {
        DataBaseUtil.clearTable(AreaMagrActivity.this, FeedTable.class);
        DataBaseUtil.saveJsonArrayData(AreaMagrActivity.this, FeedTable.class, resultArray);
        cancleDialog();
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,651评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,622评论 18 399
  • 文章作者:Tyan博客:noahsnail.com 3.4 Dependencies A typical ente...
    SnailTyan阅读 4,151评论 2 7
  • 情人谷入口处的这段路上,一步一个爱字,每个爱的字体都不一样,我随手拍了一些,但远远没有拍完。再往里走,有一块一人来...
    张方平阅读 354评论 0 1
  • 4月16日,电视剧《白鹿原》在安徽卫视和江苏卫视首播,但仅仅播出一集就遭停播,并于5月10日重新返回电视屏幕。播放...
    奇艺姑娘阅读 3,965评论 9 24